From e213ef310f412d47f8e5727412d5ce5cc574c4c6 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 17 Jul 2014 11:27:25 -0400 Subject: [PATCH 001/260] git-annex (5.20140717) unstable; urgency=high * Fix minor FD leak in journal code. Closes: #754608 * direct: Fix handling of case where a work tree subdirectory cannot be written to due to permissions. * migrate: Avoid re-checksumming when migrating from hashE to hash backend. * uninit: Avoid failing final removal in some direct mode repositories due to file modes. * S3: Deal with AWS ACL configurations that do not allow creating or checking the location of a bucket, but only reading and writing content to it. * resolvemerge: New plumbing command that runs the automatic merge conflict resolver. * Deal with change in git 2.0 that made indirect mode merge conflict resolution leave behind old files. * sync: Fix git sync with local git remotes even when they don't have an annex.uuid set. (The assistant already did so.) * Set gcrypt-publish-participants when setting up a gcrypt repository, to avoid unncessary passphrase prompts. This is a security/usability tradeoff. To avoid exposing the gpg key ids who can decrypt the repository, users can unset gcrypt-publish-participants. * Install nautilus hooks even when ~/.local/share/nautilus/ does not yet exist, since it is not automatically created for Gnome 3 users. * Windows: Move .vbs files out of git\bin, to avoid that being in the PATH, which caused some weird breakage. (Thanks, divB) * Windows: Fix locking issue that prevented the webapp starting (since 5.20140707). # imported from the archive --- .ghci | 1 + .mailmap | 6 + Annex.hs | 291 + Annex/AutoMerge.hs | 206 + Annex/Branch.hs | 539 + Annex/Branch/Transitions.hs | 60 + Annex/BranchState.hs | 43 + Annex/CatFile.hs | 149 + Annex/CheckAttr.hs | 35 + Annex/CheckIgnore.hs | 32 + Annex/Content.hs | 633 ++ Annex/Content/Direct.hs | 263 + Annex/Direct.hs | 450 + Annex/Direct/Fixup.hs | 31 + Annex/Drop.hs | 124 + Annex/Environment.hs | 67 + Annex/Exception.hs | 50 + Annex/FileMatcher.hs | 116 + Annex/Hook.hs | 71 + Annex/Index.hs | 53 + Annex/Init.hs | 244 + Annex/Journal.hs | 121 + Annex/Link.hs | 108 + Annex/LockFile.hs | 87 + Annex/MakeRepo.hs | 88 + Annex/MetaData.hs | 55 + Annex/MetaData/StandardFields.hs | 47 + Annex/Notification.hs | 101 + Annex/Path.hs | 34 + Annex/Perms.hs | 125 + Annex/Queue.hs | 62 + Annex/Quvi.hs | 33 + Annex/ReplaceFile.hs | 44 + Annex/Ssh.hs | 285 + Annex/TaggedPush.hs | 61 + Annex/Transfer.hs | 131 + Annex/UUID.hs | 100 + 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 | 196 + Assistant/Alert.hs | 461 + Assistant/Alert/Utility.hs | 130 + Assistant/BranchChange.hs | 19 + Assistant/Changes.hs | 47 + Assistant/Commits.hs | 23 + Assistant/Common.hs | 14 + Assistant/CredPairCache.hs | 53 + Assistant/DaemonStatus.hs | 271 + Assistant/DeleteRemote.hs | 89 + Assistant/Drop.hs | 25 + Assistant/Fsck.hs | 50 + Assistant/Gpg.hs | 36 + Assistant/Install.hs | 137 + Assistant/Install/AutoStart.hs | 39 + Assistant/Install/Menu.hs | 47 + Assistant/MakeRemote.hs | 171 + Assistant/Monad.hs | 150 + 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/RemoteControl.hs | 21 + Assistant/Repair.hs | 160 + Assistant/RepoProblem.hs | 34 + Assistant/Restart.hs | 114 + Assistant/ScanRemotes.hs | 41 + Assistant/Ssh.hs | 353 + Assistant/Sync.hs | 278 + Assistant/Threads/Committer.hs | 479 + Assistant/Threads/ConfigMonitor.hs | 91 + Assistant/Threads/Cronner.hs | 225 + Assistant/Threads/DaemonStatus.hs | 29 + Assistant/Threads/Glacier.hs | 43 + Assistant/Threads/Merger.hs | 119 + Assistant/Threads/MountWatcher.hs | 199 + Assistant/Threads/NetWatcher.hs | 184 + Assistant/Threads/PairListener.hs | 160 + Assistant/Threads/ProblemFixer.hs | 70 + Assistant/Threads/Pusher.hs | 49 + Assistant/Threads/RemoteControl.hs | 121 + Assistant/Threads/SanityChecker.hs | 319 + 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 | 85 + Assistant/Threads/Watcher.hs | 368 + Assistant/Threads/WebApp.hs | 145 + Assistant/Threads/XMPPClient.hs | 375 + Assistant/Threads/XMPPPusher.hs | 81 + Assistant/TransferQueue.hs | 233 + Assistant/TransferSlots.hs | 293 + Assistant/TransferrerPool.hs | 96 + 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/CredPairCache.hs | 18 + Assistant/Types/DaemonStatus.hs | 122 + Assistant/Types/NamedThread.hs | 21 + Assistant/Types/NetMessager.hs | 155 + Assistant/Types/Pushes.hs | 24 + Assistant/Types/RemoteControl.hs | 16 + 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/Upgrade.hs | 365 + Assistant/WebApp.hs | 74 + Assistant/WebApp/Bootstrap3.hs | 284 + Assistant/WebApp/Common.hs | 23 + Assistant/WebApp/Configurators.hs | 52 + Assistant/WebApp/Configurators/AWS.hs | 230 + Assistant/WebApp/Configurators/Delete.hs | 139 + Assistant/WebApp/Configurators/Edit.hs | 302 + Assistant/WebApp/Configurators/Fsck.hs | 196 + Assistant/WebApp/Configurators/IA.hs | 209 + Assistant/WebApp/Configurators/Local.hs | 427 + Assistant/WebApp/Configurators/Pairing.hs | 327 + Assistant/WebApp/Configurators/Preferences.hs | 122 + Assistant/WebApp/Configurators/Ssh.hs | 664 ++ Assistant/WebApp/Configurators/Unused.hs | 80 + Assistant/WebApp/Configurators/Upgrade.hs | 48 + Assistant/WebApp/Configurators/WebDAV.hs | 143 + Assistant/WebApp/Configurators/XMPP.hs | 226 + Assistant/WebApp/Control.hs | 88 + Assistant/WebApp/DashBoard.hs | 174 + Assistant/WebApp/Documentation.hs | 42 + Assistant/WebApp/Form.hs | 163 + Assistant/WebApp/Gpg.hs | 107 + Assistant/WebApp/MakeRemote.hs | 45 + Assistant/WebApp/Notifications.hs | 107 + Assistant/WebApp/OtherRepos.hs | 38 + Assistant/WebApp/Page.hs | 82 + Assistant/WebApp/Repair.hs | 35 + Assistant/WebApp/RepoId.hs | 40 + Assistant/WebApp/RepoList.hs | 265 + Assistant/WebApp/SideBar.hs | 109 + Assistant/WebApp/Types.hs | 225 + Assistant/WebApp/routes | 128 + Assistant/XMPP.hs | 274 + Assistant/XMPP/Buddies.hs | 87 + Assistant/XMPP/Client.hs | 84 + Assistant/XMPP/Git.hs | 381 + Backend.hs | 122 + Backend/Hash.hs | 177 + Backend/URL.hs | 38 + Backend/Utilities.hs | 25 + Backend/WORM.hs | 44 + Build/BuildVersion.hs | 6 + Build/BundledPrograms.hs | 73 + Build/Configure.hs | 133 + Build/DesktopFile.hs | 80 + Build/DistributionUpdate.hs | 167 + Build/EvilLinker.hs | 165 + Build/EvilSplicer.hs | 666 ++ Build/InstallDesktopFile.hs | 19 + Build/LinuxMkLibs.hs | 103 + Build/NullSoftInstaller.hs | 203 + Build/OSXMkLibs.hs | 172 + Build/Standalone.hs | 47 + Build/TestConfig.hs | 141 + Build/Version.hs | 69 + Build/make-sdist.sh | 22 + Build/mdwn2man | 44 + BuildFlags.hs | 92 + CHANGELOG | 1 + COPYRIGHT | 1 + Checks.hs | 49 + CmdLine.hs | 108 + CmdLine/Action.hs | 70 + CmdLine/GitAnnex.hs | 211 + CmdLine/GitAnnex/Options.hs | 101 + CmdLine/GitAnnexShell.hs | 201 + CmdLine/GitAnnexShell/Fields.hs | 36 + CmdLine/Option.hs | 83 + CmdLine/Seek.hs | 199 + CmdLine/Usage.hs | 115 + Command.hs | 85 + Command/Add.hs | 274 + Command/AddUnused.hs | 41 + Command/AddUrl.hs | 252 + Command/Assistant.hs | 90 + Command/Commit.hs | 29 + Command/ConfigList.hs | 46 + Command/Copy.hs | 40 + Command/Dead.hs | 19 + Command/Describe.hs | 32 + Command/Direct.hs | 70 + Command/Drop.hs | 191 + Command/DropKey.hs | 38 + Command/DropUnused.hs | 45 + Command/EnableRemote.hs | 56 + Command/ExamineKey.hs | 29 + Command/Find.hs | 74 + Command/FindRef.hs | 20 + Command/Fix.hs | 59 + Command/Forget.hs | 52 + Command/FromKey.hs | 44 + Command/Fsck.hs | 517 + Command/FuzzTest.hs | 281 + Command/GCryptSetup.hs | 39 + Command/Get.hs | 92 + Command/Group.hs | 39 + Command/Help.hs | 65 + Command/Import.hs | 115 + Command/ImportFeed.hs | 297 + Command/InAnnex.hs | 27 + Command/Indirect.hs | 109 + Command/Info.hs | 385 + Command/Init.hs | 31 + Command/InitRemote.hs | 98 + Command/List.hs | 85 + Command/Lock.hs | 34 + Command/Log.hs | 177 + Command/LookupKey.hs | 26 + Command/Map.hs | 253 + Command/Merge.hs | 37 + Command/MetaData.hs | 98 + Command/Migrate.hs | 87 + Command/Mirror.hs | 65 + Command/Move.hs | 173 + Command/NotifyChanges.hs | 83 + Command/NumCopies.hs | 56 + Command/PreCommit.hs | 111 + Command/ReKey.hs | 71 + Command/RecvKey.hs | 87 + Command/Reinit.hs | 38 + Command/Reinject.hs | 63 + Command/RemoteDaemon.hs | 24 + Command/Repair.hs | 84 + Command/ResolveMerge.hs | 40 + Command/RmUrl.hs | 30 + Command/Schedule.hs | 53 + Command/Semitrust.hs | 19 + Command/SendKey.hs | 49 + Command/Status.hs | 90 + Command/Sync.hs | 383 + Command/Test.hs | 37 + Command/TransferInfo.hs | 64 + Command/TransferKey.hs | 57 + Command/TransferKeys.hs | 128 + Command/Trust.hs | 41 + Command/Unannex.hs | 120 + Command/Ungroup.hs | 35 + Command/Uninit.hs | 112 + 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 | 280 + Command/View.hs | 82 + Command/Wanted.hs | 51 + Command/Watch.hs | 36 + Command/WebApp.hs | 253 + Command/Whereis.hs | 65 + Command/XMPPGit.hs | 46 + Common.hs | 37 + Common/Annex.hs | 8 + Config.hs | 84 + Config/Cost.hs | 82 + Config/Files.hs | 69 + Config/NumCopies.hs | 80 + Creds.hs | 147 + Crypto.hs | 217 + Git.hs | 141 + Git/AutoCorrect.hs | 71 + Git/Branch.hs | 195 + Git/BuildVersion.hs | 21 + Git/CatFile.hs | 113 + Git/CheckAttr.hs | 93 + Git/CheckIgnore.hs | 71 + Git/Command.hs | 128 + Git/Command/Batch.hs | 19 + Git/Config.hs | 197 + 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 | 117 + Git/GCrypt.hs | 109 + Git/HashObject.hs | 58 + Git/Hook.hs | 58 + Git/Index.hs | 36 + Git/LsFiles.hs | 215 + Git/LsTree.hs | 65 + Git/Merge.hs | 38 + Git/Objects.hs | 35 + Git/Queue.hs | 165 + 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 | 100 + Git/UnionMerge.hs | 110 + Git/UpdateIndex.hs | 112 + Git/Url.hs | 71 + Git/Version.hs | 43 + INSTALL | 1 + Limit.hs | 280 + Limit/Wanted.hs | 23 + Locations.hs | 453 + Logs.hs | 165 + Logs/FsckResults.hs | 54 + Logs/Group.hs | 83 + Logs/Location.hs | 71 + Logs/MapLog.hs | 81 + Logs/MetaData.hs | 186 + Logs/NumCopies.hs | 38 + Logs/PreferredContent.hs | 153 + 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 | 97 + Logs/Web.hs | 95 + Makefile | 262 + Messages.hs | 250 + Messages/JSON.hs | 37 + NEWS | 1 + README | 6 + Remote.hs | 314 + Remote/Bup.hs | 290 + Remote/Ddar.hs | 229 + Remote/Directory.hs | 255 + Remote/External.hs | 444 + Remote/External/Types.hs | 254 + Remote/GCrypt.hs | 411 + Remote/Git.hs | 562 + Remote/Glacier.hs | 302 + 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 | 161 + Remote/Hook.hs | 159 + Remote/List.hs | 116 + Remote/Rsync.hs | 295 + Remote/Rsync/RsyncUrl.hs | 46 + Remote/S3.hs | 372 + Remote/Tahoe.hs | 256 + Remote/Web.hs | 127 + Remote/WebDAV.hs | 399 + Remote/WebDAV/DavUrl.hs | 44 + RemoteDaemon/Common.hs | 42 + RemoteDaemon/Core.hs | 133 + RemoteDaemon/Transport.hs | 23 + RemoteDaemon/Transport/Ssh.hs | 123 + RemoteDaemon/Transport/Ssh/Types.hs | 32 + RemoteDaemon/Types.hs | 115 + Setup.hs | 62 + Test.hs | 1695 +++ Types.hs | 31 + Types/Availability.hs | 11 + Types/Backend.hs | 27 + Types/BranchState.hs | 16 + Types/CleanupActions.hs | 17 + Types/Command.hs | 81 + Types/Creds.hs | 14 + Types/Crypto.hs | 73 + Types/DesktopNotify.hs | 27 + Types/Distribution.hs | 38 + Types/FileMatcher.hs | 40 + Types/GitConfig.hs | 188 + 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 | 29 + 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 | 96 + Utility/Bloom.hs | 60 + Utility/CoProcess.hs | 94 + Utility/CopyFile.hs | 48 + Utility/DBus.hs | 85 + Utility/Daemon.hs | 183 + 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 | 230 + 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 | 70 + Utility/HumanNumber.hs | 21 + Utility/HumanTime.hs | 101 + Utility/InodeCache.hs | 210 + Utility/JSONStream.hs | 44 + Utility/LinuxMkLibs.hs | 61 + Utility/LogFile.hs | 59 + 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 | 353 + Utility/QuickCheck.hs | 52 + Utility/Quvi.hs | 148 + Utility/Rsync.hs | 156 + Utility/SRV.hs | 112 + Utility/SafeCommand.hs | 119 + Utility/Scheduled.hs | 396 + Utility/Shell.hs | 26 + Utility/SimpleProtocol.hs | 90 + Utility/SshConfig.hs | 142 + Utility/TList.hs | 69 + Utility/Tense.hs | 57 + Utility/ThreadLock.hs | 19 + Utility/ThreadScheduler.hs | 74 + Utility/Tmp.hs | 107 + Utility/Touch.hsc | 120 + Utility/URI.hs | 18 + Utility/Url.hs | 212 + Utility/UserInfo.hs | 55 + Utility/Verifiable.hs | 37 + Utility/WebApp.hs | 282 + Utility/WinLock.hs | 69 + Utility/WinProcess.hs | 15 + Utility/Yesod.hs | 72 + 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 | 3200 ++++++ debian/compat | 1 + debian/control | 115 + debian/copyright | 821 ++ debian/doc-base | 9 + debian/menu | 2 + debian/rules | 14 + debian/tests/basics | 4 + debian/tests/control | 4 + doc/Android.mdwn | 53 + ..._dc7b428f525a082834cb87221fc627ff._comment | 8 + ..._81940ea56ace3dcd5fa84dfccd88ad96._comment | 10 + ..._37aa87a451d4390ed367402eec740855._comment | 12 + ..._ba11b81c671d9bcd6f496fbd6f562b0f._comment | 16 + ..._97704e0d89bb87155e019e09e54fc9bf._comment | 13 + doc/Android/oldcomments.mdwn | 2 + ..._20e3d513b8b97496d76aca4619026cd6._comment | 16 + ..._c96b8f1cc1583a74eb2483f48357f023._comment | 15 + ..._6551f5fa081494b079c10a33c9b0d8ad._comment | 10 + ..._7c633d245651ec08f63194fe1fc194ae._comment | 8 + ..._60c2403140085f9caf48a33b59a36ab4._comment | 8 + ..._77bafc01b47d4cf8f96bde2b6704ed71._comment | 8 + ..._9af73451be09f03cfff81fdf9481ffc4._comment | 27 + ..._f76561a654b534df3a807b1c045710b2._comment | 8 + ..._1b46cdf154ddadfe17e4b6e4054dc619._comment | 17 + ..._cc9caa5dd22dd67e5c1d22d697096dd2._comment | 15 + ..._5903f6a4a81a6534fa8cfafb3b6c37bb._comment | 8 + ..._36afd354f9669a154d7b6b2c4d43ded9._comment | 8 + ..._de98154792e8611a134429f06d82bcb1._comment | 8 + ..._7ab509c25243009bfbffd796ec64e77b._comment | 10 + ..._026d1a01d5753d71ac3dfc002f2a5eec._comment | 10 + ..._f0a044fb649d43e32c96b08edbc336c3._comment | 12 + ..._6b9ae35b1ceeba14cd7a74e142870705._comment | 34 + ..._c91db1215f529aa68bfb0576c3c5eddc._comment | 10 + ..._c2422b7dd9d526b3616e49f48cf178c2._comment | 10 + ..._0e4980c27b13dbc28477c02a82898248._comment | 14 + ..._86f7b5444e2eaea7f8f7b9160f671a1d._comment | 10 + ..._9d78009435736a178d5a3f5a9bc0ed6a._comment | 8 + ..._7b9523ddb20dc4a929e556c3ed0c7406._comment | 18 + ..._a56628a622da752806c42c5b8b54ceef._comment | 8 + ..._19656ec99b8f6aa64c1d01a3c9ae9bd0._comment | 8 + ..._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 ..._f2c4857b7b000e005f0c19279db14eaf._comment | 8 + ..._befa1f48e5a43a7965060491430a6bc4._comment | 9 + ..._9bd3b532a5c026a1d664c898f8e335e6._comment | 8 + ..._c546a24459ca29025f00e424353c40d2._comment | 8 + ..._d17de359cdd46659170d373cd09c0979._comment | 8 + doc/assistant/connection.png | Bin 0 -> 3181 bytes 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 + .../addrepository.png | Bin 0 -> 2259 bytes ..._b33deed054d3aa8cfa6c9e3958643f16._comment | 8 + ..._39f1162b4d43b61e957e7497df4b9e2b._comment | 8 + ..._588869692b290483f58f3a7aa2bfb55f._comment | 17 + ..._f6bf82c263fefe38701709d9dbd974cc._comment | 10 + ..._bada601ea4b7104f162a3e00def4be2b._comment | 19 + ..._01ba0f9bfa0ed066c4b73d2d6028eecc._comment | 8 + ..._17d44229e4fa46c50815672b96a9735a._comment | 10 + ..._b9d4c29cf2cca0427808df6af08fb789._comment | 8 + .../local_pairing_walkthrough/pairing.png | Bin 0 -> 6771 bytes .../local_pairing_walkthrough/pairrequest.png | Bin 0 -> 5383 bytes .../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 | 414 + ..._bd8f376c9d0c1d5ed07fb013907a60ee._comment | 14 + ..._75e0774ad042717fbd059a8a9ec2db1e._comment | 12 + ..._b3bfd8e547e20c51f7c32c6c9424e936._comment | 10 + ..._c6caa2b521b456bb4ce594d64919cffe._comment | 8 + doc/assistant/remote_sharing_walkthrough.mdwn | 12 + ..._e0187b0a926904b363065ab0f850f0b2._comment | 10 + ..._dabcbc9aaf0bdb82716f5a5d55807a21._comment | 8 + ..._978fab3cd165b4ca245e32fc48cf0970._comment | 8 + ..._d7e879f7b098964040df2e27a18eda72._comment | 18 + ..._00852736d47c05772b15c5ff54ae7da7._comment | 8 + ..._770c4f1802fc40d76bbaf7783bb3b4ac._comment | 14 + ..._61c1f5b00381b2fa891a8578267881ab._comment | 8 + ..._35e00cd10e89ae4bcc66af7dadf6bb5c._comment | 8 + ..._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 .../share_with_a_friend_walkthrough.mdwn | 58 + .../buddylist.png | Bin 0 -> 5114 bytes ..._c87889721e3a7e52ac1ed3752fa7db46._comment | 8 + .../pairing.png | Bin 0 -> 6892 bytes .../repolist.png | Bin 0 -> 8525 bytes .../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 + ..._307898855f91a2a189d4fa5eae62cce1._comment | 10 + ..._0a8ea42764dde1a33d2112197b961c51._comment | 8 + ..._5c587c6633cae1c8547ca970d55ee97e._comment | 8 + ..._80539e11e36a0b64cee83b6b373bd843._comment | 17 + ..._00ac9e4a47ce9a886dbf573480f151bd._comment | 10 + ..._8a0860fee88f5954918305f055a39d8d._comment | 10 + ..._3d2250cc26036b8532faa980065e20d0._comment | 23 + ..._ef474c258ce8e0ebc6485c1366ae6315._comment | 8 + doc/backends.mdwn | 43 + ..._375bb1fb5973e8fa67b763f2dd6e404b._comment | 13 + ..._1f2626eca9004b31a0b7fc1a0df8027b._comment | 24 + ..._fdcbf8727fdefb9942a54689234b9698._comment | 12 + ..._46591a3ba888fb686b1b319b80ca2c22._comment | 9 + ..._2210c7ff2d5812fb3b778ac172291656._comment | 8 + ..._82f239b58680a2681bd8074c7ef9584d._comment | 8 + doc/bare_repositories.mdwn | 48 + ..._148e1da70d37d311634a0309a4ff8dcd._comment | 22 + doc/bugs.mdwn | 7 + ...o_talk_to_other_5.x_git-annex_remotes.mdwn | 37 + ..._323262a080daed9cebd4caee4c887210._comment | 10 + ..._6172dcd7db2322084483a18d4f3cc2d6._comment | 8 + ..._5ae2178863709230ddb995905c629c4e._comment | 10 + ..._19d32634789a09c1b04e9d3fcde364f7._comment | 8 + ...downloads_but_does_not_checkout_files.mdwn | 74 + ...__etc__47__resolv.conf_does_not_exist.mdwn | 26 + ..._d4f22335d5b6cb178c77579a1b450f9c._comment | 13 + ..._19dd9ebfebbece9d3654825492ebd5b9._comment | 20 + ..._4a85c4c45768f96bdc6619c193de55ab._comment | 10 + ...ith___34__Internal_Server_Error__34__.mdwn | 20 + ..._414adc1bee73711e3133c7fe8811aae2._comment | 10 + ..._977a529f488ce0c167035675f76ebabf._comment | 8 + ...___34__Full_backup__34___server__41__.mdwn | 84 + ..._3f0e3fed240252207020d31ab96d0666._comment | 10 + ..._87746f4fd0b404db7070c0b2346e8e2b._comment | 66 + ..._72c9e9f6bb5ca23ddfd513fcc8bff48c._comment | 27 + ..._b54c169a96e263e12495690fe14d8b4a._comment | 14 + ..._56ef816d3d4f3d85d31ccaf806133073._comment | 8 + ...IM__47__Camera_not_being_configurable.mdwn | 16 + ..._1fe5f8c68a430b2436649cf4ba8f4987._comment | 10 + ...__91__Terminal_session_finished__93__.mdwn | 33 + ..._31af3e5226430a4e94de58c0e33bd22b._comment | 12 + ..._a5bcbd2f85283e29e237e9850cd8109a._comment | 22 + ..._965efa6736dcff4d7010ea5533f31a59._comment | 8 + ..._90a0be2296b4a1d8c1708423666c9619._comment | 31 + ..._be4b720293992f75b9cc3e8f6687fb87._comment | 8 + ..._8e439138c97b8853ab2b6f96f6111568._comment | 8 + ..._6142516d816f78c724e22737aa3bca53._comment | 8 + ..._files_with_utf-8_characters_in_names.mdwn | 36 + ..._bcc3ce19cf26731057a7f3189fcbae19._comment | 10 + ...id_fails_on_Google_Nexus_10_Jellybean.mdwn | 166 + ..._b41666c032aeb2d0de35023328391edb._comment | 25 + ..._95ebed938df3db2b6d4ebe4c666c08f8._comment | 8 + ...rsion_broken_on_Synology_DSM_4.3-3810.mdwn | 28 + ..._c398f92de91729e60b59127733759a38._comment | 14 + ..._646087d44ee32f78784ae9e8d65d87e6._comment | 8 + ..._205e41cb0abaed3e16d45206bb2e77a4._comment | 10 + ...links_are_in_.git__47__annex__47__tmp.mdwn | 9 + ..._659e0c5127c92b1c7643823d0c240543._comment | 10 + ...esn__39__t_check_if_it_can_drop_files.mdwn | 64 + ..._f32fbae29e4db039804c0853256c238c._comment | 10 + ..._405bfa00dfd433352c263afe75e94b2c._comment | 10 + ..._c8cac8d800199ca4d8a65ba72abf678e._comment | 40 + ..._ee5fa8a22d1571b0040aa97c4979ef92._comment | 14 + ..._eef448b9e3dd1a717430a60d1001a7ee._comment | 10 + ...local_repositories_100__37___separate.mdwn | 435 + ..._418103046e296a43cfe0f0cf69e729d5._comment | 8 + ..._9405804842bb23e8040ec85b271b18af._comment | 23 + ..._01fc26e443ea3a8a351174b45f25dc2a._comment | 10 + ..._6e8f0889359bb2f3e3438658c9776f76._comment | 14 + ..._902fe9ff295453461b66d84463205fc3._comment | 10 + ..._ce01656b191d2bb13a3ddc29794e1e7a._comment | 12 + .../Assistant_dropping_from_backup_repo.mdwn | 28 + ..._c13d86fb2541676ee4ca1446b99e0e68._comment | 8 + ...e_5.20131230_64bit_crashes_on_startup.mdwn | 31 + ..._56befc288c40e062e086d93d26064342._comment | 14 + ..._107ab23eac98a168d2920bb88b4ec86f._comment | 24 + ..._7707c47aacde425ca6149dd828dd27fb._comment | 10 + ..._created_155_semitrusted_repositories.mdwn | 191 + ..._c5508b476fc48e7a0002b6ecb8d5eac0._comment | 18 + ..._cb49edcc8a13928c171a2acdde32dce9._comment | 12 + ..._a86c8347526e7b0a6f7633f3aea528bb._comment | 8 + ..._a26c2b49ee7746be06f4772aa838d5aa._comment | 21 + ..._b958da97a69091d283918e0d5a658da5._comment | 26 + ..._169b24b34cce3f5c8446c2150beb6827._comment | 8 + ..._6acd6f38297772a07d8d5fb999bd2eaa._comment | 183 + ..._6a4118e5c5fbe5e84d27094ac72b741b._comment | 22 + ..._04daa20d5d7c74bb34ec48e752ed9fe8._comment | 8 + ..._11af8ab2587e6eeb671051ba8191995b._comment | 11 + ..._26236cdc2bce532017854791bcd727d1._comment | 8 + ..._3c532dd5b8a01ecdeda1300b49aba675._comment | 12 + ..._119142c5ebc499f0ee0926dbca265308._comment | 10 + ..._0651071ee1654eeaa9aa9369873fdf6a._comment | 8 + ...er_and_over_and_using_a_lot_of_memory.mdwn | 520 + ..._edb2428552cf98bfb1735c2d6daf2b20._comment | 8 + ..._ac8c39e362e6c806b9d68befc0199ccd._comment | 10 + ..._b2941bf7901a1b2237b7210c8f0af2a5._comment | 22 + ..._1429ca784a03bc424b3537cbe0449421._comment | 23 + ..._f9e65cf5598b4b14eeee1f41f46d4084._comment | 12 + ..._044ecac2d2e670e1ef69809c944093d1._comment | 19 + ..._6f4f51e1583bed5e7e601e4f30f4207b._comment | 8 + ..._683a0a3d4caea0ee625e41ae8a6c7c06._comment | 81 + ..._03dd76b01f46a7cc66eddac3e054c8ad._comment | 8 + ..._5f4444f03cbebaa44628288095383679._comment | 89 + doc/bugs/Assistant_merge_loop.mdwn | 19 + ..._8fe176691f0f61c15085d3c38f0ea50f._comment | 8 + ..._6e3a78327c0b813415ebf85e298813d4._comment | 10 + ..._ccf46511b924f86b488dba25060baa06._comment | 14 + ..._afcbf3f8575e1a967c79693b94ef055c._comment | 12 + ..._07341221b2839fdc1c43634e011451d2._comment | 62 + ..._7ae215b478843d2a8c705cac385fcf22._comment | 8 + ..._11873461f093a266f0bb7e129bc21cde._comment | 8 + ..._e7b6ecdd7e2b0222ea0baa0ed770e66d._comment | 80 + ..._7717d074611943b831f00ad10918b515._comment | 8 + ..._5ce91ac76498539ada344d1639984302._comment | 8 + ..._b09a5eaa2588559e19b3549bd3c8b496._comment | 10 + ...repair_greatly_slows_down_the_machine.mdwn | 21 + ..._d46c6314bff75a0ae679bc2358b28c2b._comment | 8 + ..._1c2c3adfbccd2b14a7d1c4618800e735._comment | 8 + ..._a52e4ef04209d0a2449165e2b4cb9ccc._comment | 10 + ..._9f5340ab1012f335af0c246b82c1a777._comment | 16 + ..._67bfccf0934075559d439b1deafc001e._comment | 9 + ..._5fa785aa759d1a1917f2a292324fe5ec._comment | 8 + ..._9fe529034ad0115792b58d7da99c167e._comment | 8 + ..._93ed991ef2a74c18575073ca72e06185._comment | 8 + ..._4649fa11745ff668e43833209811d005._comment | 10 + ..._6138a48f0b7e8be2bb66430397afdf5a._comment | 8 + ..._3da5940bb2e9689b00239eec9a073f1c._comment | 8 + .../Bootstrap3_icons_missing_on_Android.mdwn | 7 + ..._da4e26c77376a8171493a815bdb51ff1._comment | 10 + ..._506e26de284a6429366def33b007bc0c._comment | 8 + ..._a77477951576fc657d693811f11f9975._comment | 24 + ..._c3ef67bded8ed3c511a8ea85b8bd81a5._comment | 8 + ..._97cf233d8401d642337d5fe9dd525e2b._comment | 8 + ..._4981a0a894b77e94a3bffec82b0f6e51._comment | 16 + ..._dbe960392aaa0839886381820754814a._comment | 10 + ..._cdf9621fe3e9f8eb8b7af88f779a7116._comment | 8 + ..._a2318f094b30f58fefc072807896c099._comment | 8 + ..._7c2f1d914793798708ca13b6ac3dd474._comment | 29 + ..._a24b5165590b5d58919da1003cd20c54._comment | 8 + ..._71ed14b8e5a898b1643d5e37591c2476._comment | 8 + ..._15357e33c2431080d45f7cef5f4f1209._comment | 8 + doc/bugs/Box.com_ReposnseTimeout.mdwn | 12 + ..._4ac0bf61fb4b2ac335a8a1f29e9d882d._comment | 20 + ..._29d8a9fa8d385a08fa70337baaba462c._comment | 10 + ..._b73450b3a9728ac6f34f0e63255f6fa9._comment | 8 + ..._0bd9eb5947a21d0657e79cf276923bb5._comment | 9 + doc/bugs/Bug_Report_doesn__39__t_work.mdwn | 20 + doc/bugs/Build_failure_at_commit_1efe4f3.mdwn | 45 + ..._Not_in_scope:___96__myHomeDir__39___.mdwn | 56 + ...epo__47__.git__47__X__34___for_many_X.mdwn | 37 + ..._7f54e24c8e721d69bdb1e5a4181641b8._comment | 10 + ..._6e91bc254f79ccf80d385ba7d35ffa9c._comment | 14 + ..._4cf34da6050dd96f94ffc3652aa39715._comment | 12 + ..._cafcc24e98a89f10adaed5e09f75b659._comment | 19 + ..._118d61dea9ef0faa2960da6f2f62ec8b._comment | 12 + ..._3978557c6e85608243e5b4eb698ac5a5._comment | 27 + ..._e6dfc41d2042402b40efb6f6139d5662._comment | 18 + ..._33a84937c87dd2406bc090a0d2969683._comment | 30 + ..._28bb02572d453db3b30824ec7604d91a._comment | 17 + ...e_some_filenames_have_a_colon_in_them.mdwn | 20 + ..._5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment | 12 + ..._38696178e658d1d32deec37dbea66a3d._comment | 8 + ..._f34d996827f5e7662bec409cbcce961b._comment | 12 + ...__t_start_on_Cyanogenmod_10.2_nightly.mdwn | 158 + ...Can_not_Drop_Unused_Files_With_Spaces.mdwn | 22 + ..._b909ed9f474601587b2adad7ad4f674d._comment | 8 + ..._b2735a6e03db3f77a87a0f7d87347685._comment | 16 + ..._dd82a0cd698b0688ff08f0462af0275f._comment | 8 + ..._bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment | 8 + ..._106c271d5174342055910bf57c0a34c5._comment | 8 + ..._3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment | 8 + doc/bugs/Cannot_clone_an_annex.mdwn | 69 + ..._b40a2652361a79c6c6eab0fc21be8e46._comment | 8 + ...not_delete_remote_when_ssh_sync_fails.mdwn | 8 + ..._3c8e8fae688a9db8e18e869a187fb4eb._comment | 8 + ..._e189617c4ac23df50f02af8c517fa399._comment | 14 + ...es_Containing_Non_Ascii_Char_on_OS_X_.mdwn | 46 + ..._81a4647a9b51bed8c230a2a16990915d._comment | 14 + ..._f8e97dded9ba6d2305de1278025924fe._comment | 23 + ..._eb34061429cb8c7d0b155825e84b657b._comment | 35 + ...g_version_5.20140402_in_cabal_sandbox.mdwn | 36 + ..._bd830cadaeffda0366b3ae46b34c0c55._comment | 39 + ...eleted_and_deletes_them_elsewhere_too.mdwn | 36 + ..._80ca50f5305eda71fe32f2b0bc922c34._comment | 21 + ..._e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment | 9 + ..._0d0f6b6b46d0153433fead2bbd1bbe64._comment | 12 + ..._6058a22b733cb02126286af950074ed4._comment | 10 + ..._593a49669e2fadfb91773f8c84fbb031._comment | 8 + ..._5a348c5f327f16e1192ef6bd7f2880bb._comment | 15 + ...Could_not_read_from_remote_repository.mdwn | 28 + ..._da842a9d146bcd5c7773b58364c25597._comment | 8 + ..._82746a0cf989d884cd0fd796db092b3c._comment | 36 + ..._95d16045dc238dba19a98808de2eeedf._comment | 11 + ..._when_disabling_syncing_in_the_webapp.mdwn | 25 + ..._e25dd80370820782f9c6a877101d8703._comment | 10 + ..._4031c16362137747717e9595cb5c8a15._comment | 10 + ..._0667f39f60bdaba6670f5b8304a8a77c._comment | 12 + .../Creating_a_WebDAV_repo_under_OpenBSD.mdwn | 53 + ..._47__wherever__34___works_incorrectly.mdwn | 37 + ...S3_does_not_check_for_presence_of_GPG.mdwn | 19 + ...using_git-annex_webapp_--listen__41__.mdwn | 35 + ...on_stops_working_on_mounted_CIF_share.mdwn | 12 + ..._2a5fb522cbf6e2cefbee0a5fc48287d0._comment | 45 + ..._6b8d35d464e248c29764e3adbc1c9bae._comment | 8 + ..._e134ba74ec996a419d6f9903871b9b03._comment | 47 + ..._2ad592d92dda2d1e78235bad5764f5d9._comment | 22 + ..._42ad8c7944c210ac1be812e463e03d7c._comment | 13 + ...p_ssh_keys_after_removing_remote_repo.mdwn | 18 + ..._88fbf70eae48484988dbb433a437c717._comment | 14 + ...sitories_still_use_symlinks_sometimes.mdwn | 36 + .../Disconcerting_warning_from_git-annex.mdwn | 8 + ..._58cebd377bfdf247b6c4fee27a3ba461._comment | 8 + ..._dc7407044d4c739d05248300c58d8ef2._comment | 8 + ..._13999207f4ddac2f9c345415f25f7ada._comment | 28 + ...--from_always_trusts_local_repository.mdwn | 46 + .../Empty_folders_don__39__t_get_remove.mdwn | 4 + ..._9f41638299c214b2ee13f23ab41349da._comment | 10 + ..._ssh_server_with_multiple_directories.mdwn | 19 + ..._e8affeca873c2ef73255f8f77e0ac16f._comment | 10 + doc/bugs/Endless_SSH_password_prompts.mdwn | 34 + ..._b3a32d7a53c30478f409a47f856282ab._comment | 10 + ..._0a1fc4b4580d8be4c37064e0a16de99b._comment | 8 + ..._46210f7745b8c7c237fc8b08309390fe._comment | 11 + ..._bf311301063db06bcfa8ce8d7db54028._comment | 8 + ..._7490ca530d4e7d49eaa264eb5880dd17._comment | 8 + ..._57952f91c8d55558cce18b229398f70c._comment | 11 + ..._6d6a131fda398840cfe00c52ad560ed2._comment | 10 + ...ng_remote_repository_using_ssh_on_OSX.mdwn | 39 + ..._559555934d79ae6be383063abcaae22e._comment | 10 + ..._a9f4f9db042ab6f6c15d6954651971b2._comment | 12 + ..._55a496d0a0be80ba723b17bf9faa3bc0._comment | 8 + ...r_needs_to_escape_spaces_in_user_name.mdwn | 18 + ..._6b289221a65a750444b1b5850df3386c._comment | 10 + ...ion_for_mtime_2s--__62___implications.mdwn | 138 + ..._13a35801805ea3d2d4428b1539f96b16._comment | 18 + ..._632456a0a1d399ee2bbac76b7d63a5f1._comment | 14 + ..._e4d268f269cc1701736cc5a39719ac20._comment | 23 + ..._962cd8d7280cbc1d61778d69f3a393f0._comment | 16 + ..._5b3bb068b62b12c7cc7504836a8acf32._comment | 10 + ..._5271ba4eed013adec8391ddfcc11eda8._comment | 19 + ..._7a536b79bae7d8f897f014d17dbb90b6._comment | 8 + ..._349959a6daa722c8350f73feb0b27162._comment | 16 + ..._923fc470727ecf21f0bb368b0486b15d._comment | 22 + ..._68a8434018430a0d2671c4e23e9a3b12._comment | 8 + ..._0b7d69489b9f10bb5ed617b5b62ae063._comment | 8 + ..._650d950da065eeac966c2498418c668d._comment | 22 + ..._834c512e32ad5a157d8fa9fd472831b4._comment | 8 + ..._2500e6f9545b916dfa41549140c053fd._comment | 41 + ..._e2dc3ff80bbd66837f00975b16e17126._comment | 10 + ...can_be_sequentially_copy_then_dropped.mdwn | 17 + ...om_locally_paired_annexes_when_edited.mdwn | 36 + ..._bdc97db9dc9954331e4c400baf9e5541._comment | 10 + ..._change___34__deleted:_uuid.log__34__.mdwn | 44 + ..._6441dd04adc158df22589c81746108a9._comment | 10 + ..._d1c5d7642284a375f9c455dbf76efa5c._comment | 12 + ..._4b863da1c8ba73ad54da20f7d2ec6e5c._comment | 14 + ..._8e0f489305ce30ad578b9f8526e86416._comment | 10 + ..._c699034c8e02b2354516414d0ab73aab._comment | 53 + ..._786cb7e643811dfd2496ceeff8f34f44._comment | 10 + doc/bugs/GIT_DIR_support_incomplete.mdwn | 17 + ...s_with_pubkey___40__Again__63____41__.mdwn | 44 + ..._ac3631024abf372e6f578a472b86d792._comment | 8 + ..._980c149d7f9040f5e71e662d95a5fbf1._comment | 9 + ..._c279f5cc3f96910287e72bf59120d02b._comment | 8 + ..._ec6abe7074f767f866e9618d65a4a900._comment | 12 + ..._44f80d89360a5620f919f8bc7c1c2879._comment | 8 + doc/bugs/GPG_passphrase_repeated_prompt.mdwn | 25 + ..._6ef1c9725befc84ad57bce196ef630ef._comment | 16 + ...x_requires_all_repositories_to_repair.mdwn | 3 + ..._dff1424e48835d7d3eb8653fc59de18a._comment | 10 + ...nnex_add_._dies_when_you_add_too_much.mdwn | 58 + ..._a99b96c38bba3af54e0152cc3730c16c._comment | 10 + ...hen_submodule_is_not_in_the_same_path.mdwn | 65 + ..._b3197993dbdfaf2db5e4651ac54a896e._comment | 12 + ..._1fbbd02e61ef524597dafd69460b00b4._comment | 10 + ...on_parameter_to_glacier-cli_on_hasKey.mdwn | 38 + .../Glacier_remote_uploads_duplicates.mdwn | 36 + ..._8aef582a0f0d0c7f764b425fc45de3b4._comment | 25 + ..._150ce8b7c4424a83c4b1760da5a89d27._comment | 8 + ..._718af5048c5f894eee134547a2e0a644._comment | 8 + ..._184ad0f8c2847309632f8c18b918cd42._comment | 10 + ..._6980a912d3582c2f2511e4827e9e76b3._comment | 21 + ..._feea067d6856af2840604782b29af86a._comment | 12 + ..._e96187bad3dae2f5f95118f6df87a1ec._comment | 10 + ..._34216b514a6fca788cfacb8579ce5311._comment | 12 + ...de_archive_directory_at_the_same_time.mdwn | 18 + ..._e8bb3d6a2318402b985caed08282d473._comment | 12 + ..._ead9fa75a12ef36be9a92637b144e74f._comment | 14 + .../Hard_links_not_synced_in_direct_mode.mdwn | 126 + ..._aaa781664ae0c62c4f6530cb075ed367._comment | 17 + ..._213aa10909d1fd0f20ed078a7ed93e79._comment | 8 + ..._e6b783d9aaae20c0d35e9888d878716a._comment | 10 + ..._b008ae7b1cf8685d92c9a87a7609de1e._comment | 18 + ..._949c891209713a2c0a5e66af11ed4c79._comment | 14 + ...on_switch_to_indirect_mode_and_status.mdwn | 69 + ..._94c678e1348280a96f11d7456c240d3a._comment | 8 + ..._09450d58df2373174a1f0d90b08e9eb3._comment | 14 + ..._a07105226ef3488b97731db004651976._comment | 10 + ...an_existing_gcrypt_repo_in_the_webapp.mdwn | 23 + ..._17814787e333d15da3ab4e57c7d31d4b._comment | 12 + ...erge__44___direct_repos___40__2__41__.mdwn | 44 + ..._15c354c4841d364e78882d2b46a0a764._comment | 66 + ..._8bc496226a977dbeeb1ce3f06122f1c2._comment | 12 + ...rect_merge___40__a_special_case__41__.mdwn | 48 + ..._c80418d76b501c688e3a9fb4831520fd._comment | 41 + ..._8b2a188696f46819f6e3f0e9660362d2._comment | 45 + ..._8cdbb1fda506b9e53a0e9ab88b2569c1._comment | 15 + ..._9d74e2854a5d77f0f793f56fa0cff9e2._comment | 14 + ...__40__1.0.52__41___as_seen_by_Android.mdwn | 24 + ...Duplicate_instance_declarations__34__.mdwn | 35 + .../Internal_Server_Error:_Unknown_UUID.mdwn | 37 + ..._f42f703a5d267557abf5e932f0890d4a._comment | 37 + ..._eb1999f99c5babf3fcb1ff5d72ea6db6._comment | 18 + ..._bda72b0d615843d18d6ef21f833432a8._comment | 9 + ..._651440cda405ad40a04479f5d87d581e._comment | 10 + ..._21fa189b631c246ac5df16a49c3c0178._comment | 8 + ..._1f712693d2ded5abceb869fdb7f47ef3._comment | 12 + ..._7a5ead0ce5c9429d4723ccce4f6a6d6c._comment | 14 + ..._a4683fd73ae452a9cd7f61d9930f6266._comment | 10 + ..._ced3516c3e7161e4d7e599232f62a511._comment | 8 + ...rror_unknown_UUID__59___cannot_modify.mdwn | 26 + ..._limit_uploads_to_an_S3_backend__63__.mdwn | 20 + ..._ef97e735ce308f7bcc03f5d9fda588bf._comment | 10 + ..._539b89de8743e435386b86119d1e982f._comment | 8 + .../Issue_on_OSX_with_some_system_limits.mdwn | 27 + ..._5fc1eedb5231edc37c87a2d9b91313b9._comment | 12 + ..._b14e697c211843163285aaa8de5bf4c6._comment | 12 + ..._18ddf8b5934dd6fb1676cd6adc7d103b._comment | 19 + ..._c25a8eb369e546f65e1a72d89f43066f._comment | 12 + ..._6407a3e7aa0316cba2994bfef0e3c633._comment | 37 + ..._f01887695e8b8386e125464c6d401565._comment | 8 + ..._c7776d5b2d073e0d2ae36515185c25aa._comment | 17 + ..._easy_to_turn_git-annex_into_a_zombie.mdwn | 25 + ..._d5fba6c061fb21795021ea83070dbfa2._comment | 8 + ..._12cba707239018989e8d5b6f456fa754._comment | 10 + ..._64_bit_standalone_Linux_build_broken.mdwn | 18 + ..._428eba88016d50a6631fffa906815767._comment | 8 + ..._87f70b3eececca8a5b7946cff53e0a2f._comment | 10 + .../comment_3_manually_added._comment | 18 + ..._43947607472193e2199b98ee2192af30._comment | 8 + ..._support_for_glibc_2.13_debian_stable.mdwn | 43 + ..._dc7f726a0b60f64392cbbd1b4317bab5._comment | 10 + ..._4a0198d714bd3b52ba9baa68dc45f535._comment | 12 + ...40__ssh__41___fails_to_pair__47__sync.mdwn | 177 + ..._bab9cd5bdcffec3c48b9e8657cd9bbf7._comment | 14 + ..._104898dce3c67c082a9f2b36e2f45ff8._comment | 10 + ...l_pairing_fails:_PairListener_crashed.mdwn | 18 + ..._d9c5d2147cf6d8d8477eb13b72081d46._comment | 12 + ..._60a21105145ac228f486bc4beb2ea54d._comment | 32 + ..._creating_USB_repo___40__solved__41__.mdwn | 23 + ..._0b4dcedc58e5071733e1239490aed2ea._comment | 10 + ..._1cb1ef0292a3357874b461a77c13373e._comment | 8 + ..._e5ec1e3ab304d738e3b0847287a47af4._comment | 10 + ...ror_adding_S3_repo___40__solved__41__.mdwn | 28 + ..._d95accb43bd18cc9acbbf1d4069f86b3._comment | 8 + ..._452a3c524974832f0742efb00df4d576._comment | 13 + ..._f8f6d1e0065e5ba56cd405b1c021ca09._comment | 10 + ..._b524649cee751532d20a4894d71c5cf3._comment | 8 + ..._8312ba868ef616ec00563446c9c3464f._comment | 12 + ..._1af75c691d27c97397f1901f7c2483b0._comment | 8 + ..._e519df252875de87c4ef5b727f033bdf._comment | 8 + ..._4bb959e2659991cd392853e8beacf708._comment | 8 + ...S_X_Build_doesn__39__t_include_webapp.mdwn | 12 + ..._b918a741f2397b6588e7a9f1feca7e66._comment | 8 + ...on_still_too_old_for_.gitignore__63__.mdwn | 28 + ..._1768ece63499c643c75085773b6d4c18._comment | 8 + ..._888fb193072cf05a34943db072eb7a3b._comment | 8 + ..._f199ac6ae2448949ef0779177cf0ef58._comment | 8 + ..._version_too_old_to_honour_.gitignore.mdwn | 38 + ...Manual_content_mode_isn__39__t_manual.mdwn | 89 + ...ing_symlink_yields_unexpected_results.mdwn | 51 + ..._e8a2ea1b8573bee45b70bcc7ef7e3bed._comment | 8 + ..._b6182038292bd72dc4711e4575510172._comment | 8 + ..._c6ca13d475b3f846c95606c20e1a3052._comment | 8 + ..._13179e0f72026092e48c13082818ce68._comment | 15 + ..._585c8a5a13bb17032bfe30818345f936._comment | 10 + ..._after_local_pairing_with_older_annex.mdwn | 31 + ..._8229df64a872bee7590f75eb78f78c4a._comment | 10 + ..._f37be896396915b1c85cff8811dceb4a._comment | 12 + ..._df7fc1078059538a76f384a40541e91f._comment | 10 + ..._70c444c61f41df2f59294c10f94f0c09._comment | 8 + .../More_build_oddities_under_OpenBSD.mdwn | 39 + ..._09297f99f3c1c081738ca4ab32808fde._comment | 8 + ..._1407efc78b92a3c6156154f54e4a14e2._comment | 97 + ..._fdec033e37652c51fbcd74438586d285._comment | 12 + ..._ed3716baf787ca17d227ce2e327a1959._comment | 8 + ..._cf5f92e5cdfc738e7f6178c1d7a73ceb._comment | 11 + ..._ad4b7191c9b8f67def33b26a1d762a5d._comment | 26 + ..._2e765b5286d816bea00880a17a20cbfb._comment | 10 + ..._ded9011dcdbe4de05189a0e8d040f045._comment | 10 + ..._f7a85b46bf7afaaf431d6771219c66b0._comment | 16 + ..._217be2000e423e844241d405ba9f64c8._comment | 10 + ..._4ffea64907656ff2ec65ff4450aadda7._comment | 11 + ..._df72e5698ba2bf2eb4fa39c5b2c5be83._comment | 10 + ..._4fb96984757b3d37a1a5ebce664aa8fe._comment | 8 + ..._c5fdf29499a02be83850d1238fc8ce23._comment | 8 + ..._d42106128c3dac2dd7761a82cc03912f._comment | 9 + ..._71166beb796f22dcee065a167cd5e0ed._comment | 12 + ..._65913a2de8bbe981beaa66c58d2429b5._comment | 8 + ..._8dd46cec230125d1410d8e6824aeddf2._comment | 12 + ..._275d3e62cb5667a2d6ddd90db7a40bff._comment | 18 + ..._ec6a1eb6c7b264c23ec4bbd45465d7d8._comment | 12 + ...ot_picked_up_by_the_assistant_on_OS_X.mdwn | 24 + ..._75c14b405929a8f771a7c261dcc4b7a2._comment | 42 + ..._f52483415c623ea0649c3805728ce761._comment | 35 + ..._fd73fbeef61df106f084ac235fca904a._comment | 8 + ..._c5e9843a956984efd22bad629930f6bd._comment | 8 + ...ynchronized_to_a_different_repository.mdwn | 15 + ..._651965d8a9f0e0c07313c1a2916f77e5._comment | 8 + ...way_to_re-inject_a_file_into_an_annex.mdwn | 12 + ..._c871605e187f539f3bfe7478433e7fb5._comment | 8 + ..._e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment | 10 + ..._be62be5fe819acc0cb8b878802decd46._comment | 14 + ..._480a4f72445a636eab1b1c0f816d365c._comment | 8 + ...manual_page_on_prebuilt_linux_version.mdwn | 18 + ..._certain_filenames_using_WORM_backend.mdwn | 61 + ..._a1db4ff3e8517d7cbe649bca1ed275d0._comment | 8 + ...s_not_checked_when_running_with_--all.mdwn | 40 + ..._63af5a11c3ae370433c4bf84de097414._comment | 9 + ..._download_new_file_after_initial_pass.mdwn | 119 + ..._3feba4ba84efb77bd4f8f46b6b4600f1._comment | 8 + ..._a33fcd088e419d8e6c459e42f21f8bbe._comment | 10 + ..._47196f7e781137751ebd1a1d7083838a._comment | 18 + ..._672d98ee06e051430f8e01faa93bb4cf._comment | 28 + ..._06fb3031b838cd443326f4ecd689b600._comment | 10 + ..._42d447400c15acf6ca031d165b2c781c._comment | 8 + ..._edd7d5d5c761ff665840f0ef7bea50c9._comment | 10 + ..._18e5334ab89efcf89ba8847436d55065._comment | 13 + ..._35b2bbdc24a7bd686527cd1839dee7d0._comment | 10 + ..._a771c6b453e6a4b3895dd69a53093440._comment | 246 + ...ut_the_first_copy_are_lost_on_unannex.mdwn | 54 + ..._f7149b684a97070cff051b780c73be48._comment | 15 + doc/bugs/Old_repository_stuck.mdwn | 9 + ..._package_update_from_2014-06-30__41__.mdwn | 93 + ..._7508685b6f676c72e316642b80e40ee8._comment | 10 + ..._c4dd12ea578d1f07464e1b9d68ec96cf._comment | 20 + ..._8687c1d1c44d88a8ac13208273565d6c._comment | 37 + ..._62be3dd4092b15cdf85cf9a231b2863a._comment | 8 + ..._cca4905426a3e01da6e12be855c7a418._comment | 27 + ..._ae2ca07169321c4a51b7e8e581fda5e2._comment | 72 + ..._ae5c434a9c94aa000b604095f52e3d3c._comment | 14 + ...P_sends_URLs_with_incorrect_separator.mdwn | 186 + ...use_a_USB_disk_annex_created_on_Linux.mdwn | 18 + ..._f224f4155d857a59595658357f97dac1._comment | 12 + ..._a_unix-style_local_remote_configured.mdwn | 22 + ..._95655915ff6ba9fb5d873358ff047496._comment | 10 + ...he_Comitted_Symlinks_are_not_Relative.mdwn | 102 + ...___including_original_one__44___gone..mdwn | 240 + ..._3a3891c9d7ee808f6a71780cb628f23d._comment | 12 + ..._2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment | 27 + ..._fff1e778a6334258c173a96e6bf7ef6a._comment | 10 + ..._2a86da97a89e28f0a0f5e160d4932ae6._comment | 19 + ..._41b8e8e58025cc8c8f12efb9a51acd29._comment | 50 + ..._38afcd8e7fb278ca0ee2e9e0c9f6883e._comment | 10 + ..._06de36dcde4c52ab74c8134f3242ac02._comment | 9 + ...__41___even_if_repo_exists_on_Android.mdwn | 40 + ..._9f10bf273b15e93f1eea029f091f26cb._comment | 12 + ..._in_fsck_whereis_find_and_status_cmds.mdwn | 84 + ..._3aef6ca929fad198f2dda0868f2d49cb._comment | 18 + ..._f2c1aa84a0d04e840cb34ae15eb1cb03._comment | 8 + ..._480c39648e3ca6fc58c30377bdb25a8c._comment | 16 + ..._b31496b37046a9886f632ba4f11c56e3._comment | 8 + ..._d25ff424dda1f6021c1ba20f79d71ffc._comment | 12 + ..._9e3300b223dd54a3f07c650f5cf70ae0._comment | 8 + ..._b91f4a87b6d29ae6b4262922fd65a79d._comment | 8 + ...mment_in_ssh_public_key_ssh-rsa__34__.mdwn | 23 + doc/bugs/Prevent_accidental_merges.mdwn | 16 + ..._4c46a193915eab8f308a04175cb2e40a._comment | 8 + doc/bugs/Proxy_support.mdwn | 19 + ...tween_watch__47__assistant_and_addurl.mdwn | 195 + ..._8f56b8661a600729d7a9d569e8a0ba70._comment | 55 + ..._46dc67bdcd174cd50ccc421ec56735ad._comment | 14 + ...eating_remote_repository__39__s_annex.mdwn | 34 + ..._9fffb1329a4a06111cf2afd8552aea62._comment | 8 + ..._b7f5634e136294ea1a3d4ce6de58fc5d._comment | 12 + ...positories_have_to_be_setup_encrypted.mdwn | 28 + ..._95f73315657bc35a8d3ff9b4ba207af0._comment | 8 + ...e_cannot_be_reactivated_by_the_webapp.mdwn | 30 + doc/bugs/Repository_Information_Is_Lost.mdwn | 33 + ..._bae0ed4c0a6baf1675f8de1663042f43._comment | 8 + ...local_adresses_using_avahi_or_bonjour.mdwn | 16 + ..._71cfedf4328eab224c7fb797c420ad0a._comment | 8 + doc/bugs/Resource_exhausted.mdwn | 45 + ..._bccf9528ffe963154c92ce49762e7ea6._comment | 10 + ..._24ad3a76a25a787ac59e2c5270709e72._comment | 12 + ..._1943ff77f3bccf885229ecc10c82399d._comment | 12 + ..._c3cac0717232e04e89df62efa1db0870._comment | 8 + ..._a5ef7a62d4ed9365f9448520bb17e3b5._comment | 9 + ..._cdba2015e603f3c21f3e1697dd6fafcd._comment | 18 + ..._747d16d050fdcf69dd3d2bc5ca469a2e._comment | 39 + ..._1e9b74e60da57c3d5f08c1eb3801c1d2._comment | 10 + ..._f55d933bce77fd2185ebd0cc46fe57ec._comment | 64 + ..._26c98fca45b029a527f9684873db4be5._comment | 18 + ..._8bab413b472f900e04977db2bc3951b6._comment | 8 + ..._e9bec0b80179b1229b6af0979a21c727._comment | 9 + ..._419e24e0b91f569294ece28c42daa246._comment | 15 + ...rsion_in_direct_mode___40__VFAT__41__.mdwn | 27 + ..._7e512732f1d24300dd13bb093f28122d._comment | 9 + ..._0ede40e0d68bfb9c6dbc1777f944ed06._comment | 18 + ..._4ce1601f5dbd8fb769d3c5bb429c3bc5._comment | 8 + ...mote_created_via_webapp_remains_empty.mdwn | 138 + ..._cccf9d58c0ebb8d31cacdd029ea8e23a._comment | 12 + ...capital_letters_breaks_authentication.mdwn | 32 + doc/bugs/S3_memory_leaks.mdwn | 15 + ..._a7268213b090bce6b1f1858a8e23d90e._comment | 14 + ..._320a8e3bb7b207d1aff8926b9247f5ba._comment | 8 + doc/bugs/S3_upload_not_using_multipart.mdwn | 54 + ..._5bed9faafc43b535f7820749510aaa14._comment | 10 + ..._d82952cf324e769e45f4d90f200210f4._comment | 17 + doc/bugs/SanityCheckerStartup_crashed.mdwn | 28 + ..._f30b69c11b487334ef02ce7bfcdeb36c._comment | 8 + ..._8b800bf7b54e487e82d0897c87967f22._comment | 8 + ...tificates_with_jabber_fail_miserably..mdwn | 26 + ..._13d27ba41d9ef78c8db534b6bc26314e._comment | 12 + ..._018eed99e71680be9e7c0844020419bb._comment | 8 + ..._1e7578dd1321f399b12197056495b0b6._comment | 8 + ..._a1948b7cd6ea990c8f1be5e483c835fa._comment | 14 + ..._293b333134c97dc666a825cc7a8b2b62._comment | 12 + doc/bugs/Share_with_friends_crash_in_osx.mdwn | 370 + ..._8d90e23514d9f14283857c57017a5fcf._comment | 8 + ..._1a0e174969e99e7b562854d2c3b3e606._comment | 19 + ..._dfde39222a91923c570e5405d9e527f4._comment | 8 + ..._65de2b5dd3af89c2f0f6508ffddda3b5._comment | 12 + ..._804c394e97223b1f9cc9f1f3adaa2e74._comment | 14 + ..._f1fe0c05724236988e77f4b7f393e7d5._comment | 12 + ..._3d9ec79231e1b340b5e8b7b63a902546._comment | 9 + ..._f63bb1d29fc7130bfa0c15feeba4e5fd._comment | 19 + ..._a024902e300cf50e8f6a63c7feef63a1._comment | 10 + ..._baf0333f307dff0f79cd7c73b4c56c18._comment | 356 + ..._849759a5c92de57733b14adce2f49c14._comment | 10 + ..._01530dd4ddbf620435a4d8f1edeaee8e._comment | 17 + ..._6ef922e1ebb72db8ebbff4a76017e535._comment | 19 + ...en_network_fails___40__esp._DNS__41__.mdwn | 50 + ..._dd792bd98a48554a65150c06401ed3e5._comment | 12 + .../Small_archive_behaving_like_archive.mdwn | 33 + ..._718dc246cbbbeae04436fa033011ab12._comment | 13 + doc/bugs/Stress_test.mdwn | 45 + ..._1694e990eab6592159309c231c6dcc16._comment | 12 + ..._ab4cb6eefd279e6c1f229e089f703581._comment | 25 + ..._c4c764488ac082f5c48d3a6b4b5fba42._comment | 17 + ..._42125bba09a0ea9821cda7183e458100._comment | 47 + ..._8240e61106b494d3600ad91f16eb5b1c._comment | 20 + ..._c38d84e0dcc834931804c44bce7f7b7a._comment | 11 + ..._60ce20ee255451c4ea809ba475561adb._comment | 15 + ..._1371562e201393986cd41597f6f288cb._comment | 14 + ..._a14be7699da224a8f6c9b34f1b911219._comment | 8 + ..._a01995bdca7ade7dde9842b53fbc4e0c._comment | 57 + ..._9f7efe81b7e40aaa04a865394c53e20f._comment | 52 + ..._outside_git_repository_not_supported.mdwn | 27 + ..._06ac38f32039ad43b0c2623c8fdb1df6._comment | 8 + ..._91a8daa3d49799d0784c9fe3ee10558a._comment | 10 + ..._166ae413b7c41f00f13292855ac66974._comment | 8 + ...n_in_recent_versions_of_the_assistant.mdwn | 134 + ..._8100505a7ac74646e0767d03fe643a45._comment | 8 + ..._9833e8f77c6148db9572316066a67eee._comment | 8 + ..._1504f8767f1f4415222d8c315c734e81._comment | 9 + ...4__conflictor_directory_missing__34__.mdwn | 1175 +++ ..._dfb520258fdd633285b44cb16fd35612._comment | 12 + ..._7908bf367652d2485ec703ae8958891b._comment | 8 + ..._30684a993b667b2594890f734638e91b._comment | 142 + ..._30e847ff438eda036c57cc740b638d8a._comment | 12 + ..._04232cf2097676057cddf841ad47f44c._comment | 86 + ..._9cb32f198eee25b7175cc9ad1795acb3._comment | 8 + ..._f8a70156d56c4be6cfbadb50e8a08285._comment | 174 + ..._02699dbf30270db090b00192850831db._comment | 10 + ...dfb2e706da2cb1451193c658dc676b0530968.mdwn | 23 + ...crashed:_fd:59:_hGetLine:_end_of_file.mdwn | 50 + ..._a1392b92efdff82783a4b0cc2c3c7f2f._comment | 14 + ..._5e153b7c59c474988fe551a505e545bc._comment | 8 + ...ansfers_continue_after_daemon_stopped.mdwn | 5 + ..._39eb527d64367e6762281246f1d49b1f._comment | 12 + ...oad_to_remote_although_remote_is_dead.mdwn | 51 + ..._108b3984891f82429430b503cddfb3c1._comment | 10 + ..._fa5b1bc26ed3e5bfe48441490c94fe3a._comment | 8 + ..._0a785b5dfbf4eef30854d6bedb12b7d1._comment | 10 + .../Truncated_file_transferred_via_S3.mdwn | 614 ++ ..._5962358e6067448f633cc0eaf42f9ca7._comment | 10 + ..._75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment | 19 + ..._3dae1914c8c90fdad0c21e1fc795f2ca._comment | 8 + ..._3c5fe109f2196cfc196c30da3b62bafd._comment | 10 + ..._f86f83c89300f255e730ddd23f876f61._comment | 16 + ..._6aa9261c0cdb02c6dd66d25f5c71f622._comment | 8 + ..._on_Android_due_to_weird_rename_error.mdwn | 37 + ..._928289956111d1b22f9d55f15b54f72f._comment | 10 + ..._6a0cb836b93ba4cb1e07b11d5d2a7094._comment | 8 + ...Unicode_file_names_ignored_on_Windows.mdwn | 41 + ..._3dfa4559dceec50c08ba180f41b4c220._comment | 14 + ..._4dafea4367d455c2e63b0f7b1cc39559._comment | 10 + ..._bdde68a990a330ee0cf626be44b1c132._comment | 8 + ..._9140fb8034b1449ee2f4762093bc1f89._comment | 10 + ..._661ca15b68bc0e3fbe85f11400570446._comment | 15 + ..._0e8820169c0300d296c697154fd05dc4._comment | 8 + ..._b23a2bf106053f105798b270536057e5._comment | 38 + ..._7f23911705eaa58a9230f19ab890e87f._comment | 12 + .../Upgrade_Does_not_Complete_on_OS_X.mdwn | 32 + doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn | 22 + ..._8c1487635f724d017ebe2f8b7bc10e8d._comment | 8 + ..._84e52a4d1502fd622bdb25e04b459292._comment | 13 + ..._f2b109f6cf92f101d7f0afeb91605240._comment | 24 + ..._df9b111aefea82b9d108495b79d7ffb4._comment | 24 + ..._e3b5bc815376383bbd1f312cc1c32a41._comment | 12 + ..._cd9b77e6670840a9902f5be80e1e658a._comment | 87 + ..._4584393333d377532d8607b42319abd9._comment | 8 + ..._d9d36ff62267dde98a27c5981951df7f._comment | 10 + ..._5b26711c737eeb0b302060f098cb320b._comment | 8 + ..._1bf050056dcac7c1e0f497ee6e87a95a._comment | 10 + ...y_limit_on_max_filenames_in_directory.mdwn | 2 + ..._47__storage__47__sdcard1_-_bug__63__.mdwn | 45 + ..._71b052be40fbdaca09ca3ede8c59ac7a._comment | 8 + ..._0f7cc02e0193c969c9b6ceb27e71af8a._comment | 20 + ..._1a7542249b9c37507126e97441057c12._comment | 12 + ...Webapp_fails_to_resolve_ipv6_hostname.mdwn | 15 + doc/bugs/Weird_directories_appearing.mdwn | 82 + ..._989541faf18e476c06e3be94c979e588._comment | 10 + ..._7aedaa3286a827303d90bd660429f0e7._comment | 43 + ..._5d3afa17d1e038c66a2cb6400b74aa41._comment | 8 + ..._8db476bc89d3b9b1fdd82624829b4975._comment | 8 + ..._4f3a8e3b0201829059c6e7e0cff0ff75._comment | 10 + ..._1c3218c8858397acc0e9fd718d7fd973._comment | 8 + ..._9d055063f58042ff048c5b71e9e67f6e._comment | 8 + ..._b39be0251e96099142b659f3c8340293._comment | 8 + ..._431c62c81573468ccf99eeed6ecc2bfd._comment | 8 + doc/bugs/Windows_build_test_failures.mdwn | 1232 +++ ..._ea7523fdbafdc8be2971df52d9038826._comment | 10 + doc/bugs/Windows_daemon_silently_dies.mdwn | 132 + ..._b590aaeedec78c8540d549a8c773881e._comment | 10 + ..._472975d2bd9784ae40b35f11fc561231._comment | 72 + ..._48415a7251abffca998b8dccc5e0ba80._comment | 22 + ..._1c0b0b2e7180425ff2d5e5316a138f7d._comment | 10 + ..._0d14dd2c8d94a81ffd5aae07e927344f._comment | 40 + ..._20a420680058f84a8cbd43682957fe7b._comment | 8 + ..._1514739ba9885917d03597dcc6aa7bec._comment | 20 + ..._0210436870e6622a83c9b4788e31eef4._comment | 8 + ...ndows_file_timestamp_timezone_madness.mdwn | 31 + ..._9db59ab2242186a23a47337a1597f4e2._comment | 12 + ..._a6a3871747306913b69abcd73d13305e._comment | 26 + ..._7fe149bedb8ceab75953996ac8e20f0f._comment | 20 + ..._c9e8c9997b7c3a82c14fc34af319382d._comment | 10 + ..._0739426403f5bf9954acbc86ca0d11ea._comment | 23 + ..._and_wget__44___but_not_required_DLLs.mdwn | 17 + ..._a7bf0f027f2209e5632e292afd7214d0._comment | 10 + ...e_letters_cause_git_annex_get_to_fail.mdwn | 131 + ..._c87bae87b7902db60a3fef41e1fca85d._comment | 9 + ..._9e3c1f1ba05d8996b5a95829ce32c07e._comment | 10 + ..._3a0787912f4a3a8797b7786f5ce38590._comment | 8 + ..._c4249f32d65594d79ea01145b93ec948._comment | 9 + ...emote_annexes_have_at_least_numcopies.mdwn | 39 + ...ong_port_while_configuring_ssh_remote.mdwn | 35 + ...esses_and__47__or_stuck_git_processes.mdwn | 44 + ..._0f8b248025722309e9577d7dad74b76b._comment | 10 + ..._f5f7db688a2a93ee7453674fb742043b._comment | 52 + ..._ffcae976aa3dc2426188797c1aaffb82._comment | 10 + ..._8a7ff6841ad7c27ead06bf12f46b20a0._comment | 49 + ..._406fdee0728680774a69d28446163f10._comment | 26 + ...sferkey__187___fails_for_bare_remotes.mdwn | 21 + ..._dd4538ab19a7f8e0f49aa0156aeaae43._comment | 32 + ..._4276ff682d10c1d4be9728f9b649ebae._comment | 10 + ...___40__Permission_denied__41____187__.mdwn | 33 + ...dding_4923_files__34___is_really_slow.mdwn | 102 + ..._5f3b9f00bc31ce71d695c008971ed7fd._comment | 16 + ..._708b02dd06a1eed6b5ded9eb7aa9e7a8._comment | 16 + ..._6a735b7875d2a0c92df6786dd649985d._comment | 28 + ..._7e768908ba6983ea13af27635c4a947f._comment | 12 + .../__34__fatal:_bad_config_file__34__.mdwn | 14 + ...ex:_direct:_1_failed__34___on_Windows.mdwn | 107 + ...it_add__39___for_parent_relative_path.mdwn | 15 + ...ot_installed_automatically_on_xubuntu.mdwn | 26 + ..._f4656f8a0f36535def0772db06098c5f._comment | 13 + ...nux_accessed_from_a_windows_git-annex.mdwn | 27 + ..._symlinks_are_fixed_in_the_background.mdwn | 51 + ...96_____95__revives__95___repositories.mdwn | 88 + ..._930b40e0f68da95d335eea5bd4216126._comment | 12 + ..._5397d488bc337cb3d7cb46ed774d0437._comment | 90 + ..._1b30e7611ec824dc6e79ef35e43ac740._comment | 10 + ...git_annex_import__96___clobbers_mtime.mdwn | 62 + ..._d173f2903faf4bff115a0be02c146ce9._comment | 8 + ..._3563d9eeb9806f8ca1b9b340925837f5._comment | 18 + ..._d5c7488db16b71c4f337662c897278ca._comment | 95 + ..._7235130786e764ec3ad5facfecde62da._comment | 8 + ...__fails_due_to_missing_stm_dependency.mdwn | 95 + ..._86e26ee9ec90aa00f25392052737f0f0._comment | 36 + ...ch_repositories_on_android__in_webapp.mdwn | 21 + ..._d488d71a72eb54d7711d2a867db6172f._comment | 8 + ..._85b31db6d0fb2d20018db3d8c8258bf4._comment | 8 + ..._9ffafbeb572e110b3e072029d1ce177c._comment | 8 + .../acl_not_honoured_in_rsync_remote.mdwn | 59 + ..._aa6fe1d7b029eae7ee71c97e0f0937a6._comment | 8 + ..._ffb9424e966ee10a4fe2d446b3042cb2._comment | 10 + ...kes___39__git_annex_unused__39___slow.mdwn | 87 + ..._d350c39c67031c500e3224e92c0029ea._comment | 19 + ..._b2d2b1caa51ffec3d87c36b373cb8d4a._comment | 20 + ..._12b20cbbc2b4cd1ab8af7e3eec9589b4._comment | 30 + ..._a50b43c15d2650df90f0fa1ced47f532._comment | 10 + ..._7328bc51bd001f2b732a92a2ae175839._comment | 114 + ..._880ef2ee797221332dbb629b2d55522f._comment | 10 + ..._826fd82cdf9b1c79c9b555ca26c2c176._comment | 8 + doc/bugs/adding_a_remote_server_fails.mdwn | 27 + ..._cf7ea9171f002c5793a882b42d33a77d._comment | 10 + ..._remote_in_webapp_may_reset_its_group.mdwn | 16 + ...__and_reports_fail__44___but_succeeds.mdwn | 197 + ..._1f5e0bc93631baf0f8c1bec2e68493c5._comment | 20 + ...axy_nexus_java.lang.SecurityException.mdwn | 41 + doc/bugs/android_4.3_install_failed_.mdwn | 20 + ..._82447f1e24d7e8df8048464d1b7df117._comment | 8 + ..._67ace7c454c7e962ca69e42178142e80._comment | 8 + ..._051e39129a38e439f24703385f503cf4._comment | 8 + doc/bugs/android_autobuild_broken.mdwn | 4 + ...nnex__47__uninit_should_handle_copies.mdwn | 20 + ..._c896ff6589f62178b60e606771e4f2bf._comment | 10 + ..._9249609f83f8e9c7521cd2f007c1a39e._comment | 8 + ...ing_shared_libraries:_libselinux.so.1.mdwn | 31 + ..._ccc2c90d05862edda9ce1ac92efab516._comment | 44 + ..._1cdf6de88c7f121c604177593915e626._comment | 8 + ...ad-pack_and_-receive-pack_not_shimmed.mdwn | 23 + ..._403f1058c3eab5c95fefab5a96aa3f51._comment | 12 + doc/bugs/assistant_-_GTalk_collision.mdwn | 17 + ..._ab2c1f36113d40f27e1893d32f214296._comment | 12 + ..._91dff34c629a3b3a97a2313ff077e4ae._comment | 14 + ..._fefb73f6e570f96b4d82779d6622f690._comment | 8 + ...adding_encrypted_usbdrive_repo_on_mac.mdwn | 53 + ..._4ea192e57f86a33087997746722e6acf._comment | 10 + ..._622ad5b34780fc8468c5c515ad9f27fa._comment | 8 + ...ating_.git_directory_inside_bare_repo.mdwn | 90 + ..._675210444f7801eb8c2c455a5accf8e9._comment | 12 + ..._d7f1378bc75e7a8be9da2585acc6fd63._comment | 8 + ...oes_not_allow_adding_an_existing_repo.mdwn | 10 + ..._87e84d56d56abefe8cac8a52b76c9003._comment | 8 + ...epo_cost_info_when_queueing_downloads.mdwn | 18 + ...t_doesn__39__t_sync_empty_directories.mdwn | 32 + ..._78a3bde607f43c0f518bd2d3d7196022._comment | 8 + ..._83777384b72732b1d0a19b32686d3d1f._comment | 8 + ..._f9b2a700c060707fae1bcb2ec0e4e4dc._comment | 9 + ..._014d213a959dd7993bdd247722a8817e._comment | 8 + ..._440f349781d7d9ca2d1ed81386f7dd26._comment | 8 + ...nt_doesn__39__t_sync_file_permissions.mdwn | 47 + ..._fc8d3ea209a2ab39c1aeff52452d4c58._comment | 10 + ..._1a364c422e0dd7418f74e1cc3d543a3c._comment | 8 + ..._4d5ae51b4c7e6177d934d7c9f21b912c._comment | 8 + ..._ec7b491ad3c9a1f253d886682bff8b82._comment | 11 + ..._e04ddcd7a3d260c1dac54e41911bb4bc._comment | 10 + ..._13db3474113b157b7431eb1c835e5814._comment | 14 + doc/bugs/assistant_eats_all_CPU.mdwn | 529 + ..._4a9f149048e387e0a8b4ebb0838decfd._comment | 8 + ..._98be30621a8a435ed54662f7ea9654b4._comment | 10 + ..._a7d7141b81e73a989eb5c1233bcd1478._comment | 15 + ..._60f95e6e5d52f03727bd41f8419c9384._comment | 10 + ..._a6d039ba95f92d9d0c3a343165ba7991._comment | 36 + ..._b7f9a8e214eefc3a6976065782157e81._comment | 28 + ..._16382708d1683a7a9eaaf953f3cdb735._comment | 8 + ..._bfa64822ad9b48fbd4d06c3e3a185b59._comment | 8 + ..._970899faca972af6795ae0d3be1ce444._comment | 42 + ..._2b8241800ae265260506ac9c73cca209._comment | 56 + ..._847ff393fe3a0227d61440f6be899907._comment | 10 + ..._1d9020679d66e6b4742df067cb9da4f1._comment | 9 + ..._8ce65a701604b9d13941844c62f62f23._comment | 14 + ..._0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment | 12 + ..._48a4c8d9dcc6cec243c6072090f26b6d._comment | 12 + ..._0d577d5ca22df14dadf21d4a1a5f9474._comment | 12 + ..._498eee32426dfbaf9bda59a7c0f6fcc9._comment | 8 + ..._ce85b4715a2f7315b68bed62e26d4f0e._comment | 8 + ..._8cf846b9b7bd1c70a006163a9cc2d9de._comment | 26 + ..._a7c9f3262b6eca6258ba53324d321a7a._comment | 17 + ..._340414e9c19903b16ab617d075fbb94e._comment | 10 + ..._e87dbb572eaf234bbaf48ed6790ab1fe._comment | 19 + ..._1c129c924ef3a4a594de6580cf4224c7._comment | 11 + ...nsive_scan_unnecessarily_queues_files.mdwn | 65 + ..._bc874e077009b81ab36a6d43d793030a._comment | 10 + ..._a7e9d8ec500399dd6794e168f85e6a5c._comment | 40 + ..._a0824e00f04f95c39823f29d6c76e7fe._comment | 10 + doc/bugs/assistant_hangs_during_commit.mdwn | 27 + ..._aacc15c589d2795254387e427b3afe0c._comment | 8 + ..._b9f1bf9fa919603dca28182c80d39a11._comment | 10 + ..._fb5be10fcf5e7c89da5c34f48539612f._comment | 12 + ..._9ba7efe9112578729d02ac4e6557b3cc._comment | 10 + ..._73b24c901c73d41e0e0abe91267d4920._comment | 16 + ..._1a30b8c82e58222f1366aa368c23e6d3._comment | 10 + ..._56868b2a504ad0a60e8a8c1928330175._comment | 8 + doc/bugs/assistant_ignore_.gitignore.mdwn | 31 + ..._3458b1342cb2e3ccc01eeedc7f0e48fc._comment | 8 + ..._22f75af80c779dcb4d6033b90373f74e._comment | 10 + ..._8b2a400e1d44a1c9b183e2b7861efbe3._comment | 8 + doc/bugs/assistant_locked_my_files.mdwn | 30 + ..._74ee7ea12df7bfbb44c9d0485f787b73._comment | 8 + ...g_file_renames__44___not_fixing_files.mdwn | 68 + ..._e0dafc410ffd617d445bb9403c7bfafe._comment | 9 + ..._2af247c8a1fcbde10795a990ef3303e9._comment | 9 + ..._remotes_using_the_standalone_tarball.mdwn | 21 + ...emotes_even_when_all_remotes_disabled.mdwn | 33 + ...nt_unable_to_auth___40__windows__41__.mdwn | 85 + ..._3128b025d15d3af6e9c8725d4659cdfa._comment | 12 + ..._e0b64ab2d19f0b0afbd466aad22c4df9._comment | 8 + ...g_the_incorrect_path_on_windows__63__.mdwn | 45 + ..._68be9ee77cc89fb72a4abc944f1da41d._comment | 8 + ..._6530d67e7d94ccbea9ce11ba1445035e._comment | 9 + ..._682556a8182abd5bd6abb57b519d4c76._comment | 10 + ..._331cdacb099a8c7b170c37715bbca895._comment | 8 + ...othing_to_drop_or_copy_to_that_remote.mdwn | 5 + ..._10a9570a5d762ba2da271b38dc63edb6._comment | 12 + ..._57d50955b038c2e2405068536c7e83f3._comment | 8 + ..._a66f34daaba421c87eb404ef933e5191._comment | 10 + ..._094a3272eca1c6d2b4d264911ffe96e5._comment | 19 + ..._0161410d042a3421addd4a1fc7c1cd01._comment | 10 + ..._with_file_names_with_newline_in_them.mdwn | 5 + ..._92dfe6e9089c79eb64e2177fb135ef55._comment | 10 + .../bad_merge_commit_deleting_all_files.mdwn | 78 + ..._3503644244e39c65d531807769365f50._comment | 10 + ..._9c4c950da0c07bf7c7edfcc7cc3b6011._comment | 8 + ..._be42de12faf15562265ad6cf8964f5db._comment | 18 + ..._d5cbd1440e4d6706eb14644a4ff1883b._comment | 8 + ..._c532859deb682dff9e59037d08f66a51._comment | 8 + ..._c946d2793fe0354151c447ddd0e59fd7._comment | 41 + ..._24dea380fcf470e0ea488dece0410f37._comment | 8 + doc/bugs/box.com_never_stops_syncing..mdwn | 74 + ..._124a5edcd89cc6b61e1a41f5b4d640d7._comment | 10 + ..._42574181aa721319ba54eadf0a15ddff._comment | 11 + ..._2ad727849070cfd52d6c719478e9cce3._comment | 8 + ..._83ce23e45f5a5845d4f04519ee14ec65._comment | 9 + ..._ef1c9d87b04db5047ab72167d3269687._comment | 8 + ..._c9cb39eba941678035f9b2888da1085c._comment | 10 + ..._4b0632a4e37c96959a8e6434e9fd86fb._comment | 17 + ..._d9d318b8c958de6031ae323da20af625._comment | 55 + ..._689ac6a4a305197cf5566f98dab47b4b._comment | 8 + .../broken_git_annex_map_on_direct_mode.mdwn | 58 + ..._in_Assistant__47__WebApp__47__Gpg.hs.mdwn | 57 + ...e75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn | 25 + ...ff14054e65ecbe801eb66786a55fa5245cb30.mdwn | 43 + ...jabber_with_custom_google_apps_domain.mdwn | 21 + ..._6537e928a0d6d5c41b55370f112f4afb._comment | 10 + doc/bugs/can__39__t_get.mdwn | 81 + ..._ef32287828481c161bd913c9db9052a5._comment | 27 + ..._31fe400f4bac516a5c1101612cb06a54._comment | 32 + ..._87d123c04815d38abb92f967829c3a23._comment | 16 + ..._b99cff87dbe38f08f888200dfe7e2436._comment | 14 + .../cannot_link_executable_on_android.mdwn | 28 + doc/bugs/case-insensitive.mdwn | 20 + ...rgument___40__invalid_character__41__.mdwn | 228 + ..._processes_can_lead_to_locking_issues.mdwn | 53 + .../configurable_path_to_git-annex-shell.mdwn | 7 + ..._fb6771f902b57f2b690e7cc46fdac47e._comment | 10 + ..._2b856f4f0b65c2331be7d565f0e4e8a8._comment | 8 + ..._aea42acc039a82efc6bb3a8f173a632e._comment | 12 + ..._178452f3c2671830d1a9f5e1d11accb4._comment | 8 + ..._77b2269936f740cacbc955b95f9da51d._comment | 8 + doc/bugs/confirmed.mdwn | 5 + ...ls_for_some_fails_without_explanation.mdwn | 7 + ..._0c1a5837305b721fc4a529cae3f4c3fb._comment | 10 + ..._dabfec2d74fb847f3b40093a2866045b._comment | 8 + ..._e456604b26ed9c72b0a88cfb57f1a475._comment | 12 + ..._4823d66bfb569605868af5cefe0d94dc._comment | 12 + ..._46305aa2d43da000c1a7cb003c822572._comment | 18 + ..._1dbdeded7f587e8fc2d1ac5170ecb928._comment | 8 + ..._1e0c06a07345d85b3712339e6f0d9a9f._comment | 8 + ..._41798e92068eb227c5e75cae2edef68a._comment | 10 + ..._1f33d694a08d8dcbf04595e3442b8cd5._comment | 8 + ..._884f31ce917c8e5ce9a32a55da9b42d6._comment | 10 + ..._ab770dafee3bd9212f553db222adbfe6._comment | 10 + ...ould_not_mention_every_file_it_checks.mdwn | 28 + ..._5f51452d939d61496e97805310746ea3._comment | 14 + ..._2cd3e9561c4442259c765743b423a7df._comment | 8 + .../copy_unused_and_unused_not_agreeing.mdwn | 50 + ..._a11a45868867361fcff61471ffe0ce39._comment | 10 + ..._15559ba19393f5c061f77bc56379f8e1._comment | 12 + ..._9b1340e0f6a107695849c04374aaeae2._comment | 10 + ..._b88530080fd90686cfa7e336f8328dcb._comment | 8 + ..._792ab128a91c66e4ddeaa69d09430a78._comment | 20 + ..._e44a16ef3358a6fbcc6ed6b3a31f3273._comment | 8 + ..._635acd64b524c682c58f26ae96ae0d7d._comment | 10 + ..._1aaeb808e20c67f89eaac5e45d9309f0._comment | 15 + ..._6abca5f4927e09089cdc5f0bd27b798f._comment | 26 + ...y_where_a_mountpoint_should_have_been.mdwn | 29 + ..._41cfd5e48426a6ef52bef70a06a6f46a._comment | 11 + ..._bd584ccbe128427fca99e61d66d301c9._comment | 18 + ..._5bb0347215b321444643646f25a35759._comment | 10 + ..._73848a9c783ecf3d9fccdd41b20fbe36._comment | 56 + ..._64bf56f2b0ff206c3caf5cadebfd0cda._comment | 20 + .../creating_a_remote_server_repository.mdwn | 24 + ..._de1a370347428245bcfca60eaca96779._comment | 10 + ..._482ac9b0f881099910f9bd9f7cda184d._comment | 8 + ..._b7c7f684d0eef14fcc00cb2ac0566703._comment | 10 + ...s_directory_not_automatically_created.mdwn | 3 + ...ct_mode_assistant_in_subdir_confusion.mdwn | 37 + ..._351143deec29e712f8718a373ad650d7._comment | 8 + ...s__44___left_in_an_inconsistent_state.mdwn | 60 + ..._be1302a006a66e501fe543f3af191fea._comment | 22 + ...erwrite_local__44___non-annexed_files.mdwn | 14 + doc/bugs/direct_mode_merge_interrupt.mdwn | 54 + ...efuse_to_merge_with_illegal_filenames.mdwn | 38 + ...T32_fails_to_addurl_containing___63__.mdwn | 44 + doc/bugs/done.mdwn | 4 + ...opping_files_with_a_URL_backend_fails.mdwn | 13 + doc/bugs/encfs_accused_of_being_crippled.mdwn | 41 + ..._5c5be012e1171ef108f38825d72791b6._comment | 23 + doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn | 42 + ..._46c37aacb7ae41864488fb7c7d87d437._comment | 10 + doc/bugs/endless_loop_when_PWD_gone.mdwn | 16 + ..._0943cffa39d48e4dddde3b7aedc4e3b1._comment | 8 + doc/bugs/enormous_fsck_output_OOM.mdwn | 30 + ..._490b8bfe95b01a23408ecb5d63dcd40b._comment | 10 + ..._2666c135dd3378cf6301aa4957049fbd._comment | 10 + ..._dfb169c441215b671f8c971184de3e16._comment | 10 + ..._19ef90803aa7ce158bce02378e18ea0f._comment | 30 + ..._2b5406768fff2834f7aefa76ef949de2._comment | 12 + ..._0997f1a94c2fda9fe69824e074011518._comment | 18 + ..._2cdc79f1e0f72693814e91dc88a758e1._comment | 10 + ..._b9aab0aba4dab30260371b4762e0e51d._comment | 8 + ..._8de694dff75e27856c8282d1f2d120b6._comment | 14 + ...network-info_when_compiling_git-annex.mdwn | 12 + ..._1b5d236567123300924427624e0e48c8._comment | 53 + ..._4e5ffd0d5b965b9429b937610b7998d5._comment | 8 + ...rror_on_only_repository_copy_deletion.mdwn | 16 + ..._af394ac0956ab33a77256bcb02ef2a0f._comment | 14 + ...eous_shell_escaping_for_rsync_remotes.mdwn | 15 + .../failed_sync_with_direct_mode_repo.mdwn | 9 + ..._fb4026cc81eb0ec1e656e4a81ffacc4f._comment | 13 + ...get_content_from_bare_repo_on_windows.mdwn | 143 + ..._31cf32ef2d597573ed3c5f06a1b40a1c._comment | 10 + ..._7d64382c66555ec9c5531840aa19e809._comment | 10 + ..._850a917a3d1ae50ba8f0e81a64168268._comment | 10 + ..._7c4660ea44178cba7f7a4cc5f1bebae4._comment | 8 + ...ing_ssh_key_setup___40__windows__41__.mdwn | 12 + ...hould__34___exist_in_remote_is_silent.mdwn | 37 + ..._c686df2824d3f588c0bfb339c99168b7._comment | 29 + ..._22edfac4ce25cd9f4e4c85e0a8a52bc1._comment | 14 + ..._74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment | 17 + ..._7d642fc65040a7b583cdece33db01826._comment | 8 + ..._49be366b6af6db595fa538373a61e650._comment | 10 + ...ure_to_return_to_indirect_mode_on_usb.mdwn | 19 + ..._d7822b90c68bf845572b0a04a378d0bb._comment | 10 + doc/bugs/fat_support.mdwn | 13 + ..._04bcc4795d431e8cb32293aab29bbfe2._comment | 12 + ..._bb4a97ebadb5c53809fc78431eabd7c8._comment | 14 + ..._df3b943bc1081a8f3f7434ae0c8e061e._comment | 11 + ..._90a8a15bedd94480945a374f9d706b86._comment | 10 + ..._64bbf89de0836673224b83fdefa0407b._comment | 8 + ..._a3b6000330c9c376611c228d746a1d55._comment | 8 + ..._a0ac7f2c44efc8116940c7b94b35e9d0._comment | 7 + ..._acc947643a635eb10a1bff92083a3506._comment | 10 + ..._git-write-tree:_error_building_trees.mdwn | 103 + ..._77295c0b749e984a6fb200d3b73b5765._comment | 8 + ..._Invalid_argument___40__Windows__41__.mdwn | 63 + ..._e6f39b2ef55b0daa491f4b6329a906bc._comment | 8 + ..._b47d6d188f38a8e4ca5ef5f70afadf6a._comment | 48 + ..._b533b1de535a057b7ebf99afc92691ed._comment | 13 + doc/bugs/files_lost_during_upgrade.mdwn | 2191 ++++ ..._3f779c4d0c9fb27532b2981bd3ad4eee._comment | 22 + ..._80ba8c217e83c9d44a9dc52f4028719d._comment | 11 + .../follows_symlinks_to_outside_annex.mdwn | 3 + ..._f7a01bb627a6780d6940886401cde454._comment | 10 + ..._fcbeffab5a0146062a9c945dfff48507._comment | 8 + doc/bugs/forget_corrupts_non-ascii_chars.mdwn | 78 + ..._fc8a4a93be2c234567836a4acee90957._comment | 22 + ..._31f9362619dee0b8ebae80694ae1b2d0._comment | 8 + ..._6310ae21036582688881f1890a5c4643._comment | 8 + doc/bugs/forwarded.mdwn | 2 + ...sck_giving_false_checking_information.mdwn | 29 + ..._1000603ea6b8a19eb09e6754789ad528._comment | 10 + ..._3ce7c8f7098f0bf86ed409a3a095c152._comment | 14 + ..._be4d0fec56c29cf978ef7d1715eaa516._comment | 14 + ...-shell:_gcryptsetup_permission_denied.mdwn | 48 + ..._f4584158b35b80ece1060308883e2dc4._comment | 8 + ..._a4d7aae848340771a9b8e2c87abeea42._comment | 26 + ..._06bda101ad584b4b882de8b2e202d679._comment | 8 + ..._4fc6b25401b645cabc04b510bdfa6863._comment | 10 + ..._4e193306801680bba433e75eb4dcba05._comment | 12 + ..._76ccdf0542e76e4dbd61f3b3228d40ba._comment | 10 + ..._cd964d0a375c5cba299bf2bbbbb86acb._comment | 12 + ..._9bac87c85deb5bb15795df28533d0cde._comment | 10 + ...sn__39__t_seem_to_use_the_bundled_git.mdwn | 50 + ..._73924adc1c3c0dca5adce9a5e1740e48._comment | 10 + ..._81c2896c9dfe5d96ad5a8f40cb312790._comment | 10 + ...urce_vanished___40__Broken_pipe__41__.mdwn | 18 + ..._e962317a939bf76097ae1a3b53b146e6._comment | 14 + ..._b32472b4c9b61e7a33dca802ecafb05b._comment | 11 + ..._fcfea3216831df9afbd855fbd842c27e._comment | 20 + ..._30d0b40efa59eeecb8a4be6d1baa1520._comment | 10 + ..._4af107f3184bc2abd2c9693167018628._comment | 8 + ..._f96027f1e3c405809fae42ce8533c6d1._comment | 8 + ..._b6fe89deb468a7e4f63f7faab147e3fb._comment | 12 + ..._ebec5d9266604f03959dc16d933ff4a4._comment | 13 + ...d___40__Operation_not_permitted__41__.mdwn | 33 + ..._b7a327b668e2ca053713bec1dc4e6314._comment | 14 + ..._8864149bd87f7956143109ab591afe4f._comment | 19 + ..._1229d5ea8799f0a744b3f03f620df1ec._comment | 12 + ..._975d2631faa17d257a6fce40e24a6e3b._comment | 14 + ..._013be36151fc710ec30756b0f68f43dc._comment | 12 + ...t-annex:_fd:14:_hGetLine:_end_of_file.mdwn | 51 + ..._36756f5d9d591cc52113c5cc0c1eae91._comment | 8 + ...ntryForID:_failed___40__Success__41__.mdwn | 13 + ..._11a1615962325327466895d03e3d2379._comment | 8 + ..._eac51c3299e9fc04025675360969d537._comment | 8 + ..._c23dc02c7487d63b0905f1b7f3ca59f5._comment | 9 + ..._0e8b28de5c173bc60ecc0126fb2209ca._comment | 10 + doc/bugs/git-annex_annex_repo_not_found.mdwn | 23 + .../git-annex_auto_upgrade_is_redundant.mdwn | 34 + ..._67cdbedc70695d1e4be81e59ab9b87bd._comment | 9 + ..._3a8041ce622b9288261fab57ecb87c28._comment | 8 + ..._2597b2008557b80f4b71630c5c4a4241._comment | 8 + ..._5dc46103994f064f5b9e120a16317dbd._comment | 10 + ..._e26cf6fa6358c8d53c0b16206d0d0ca6._comment | 14 + ..._c2c7c071fc5b1d3a55254d01a287c9f8._comment | 8 + ..._85e8a286d6b1ec5212614c36bf54addb._comment | 10 + ..._2b2152844612d83f295a5de02f6ed3e7._comment | 8 + ...ch_shows_commit_with_looong_commitlog.mdwn | 74 + ..._b83888a98075125dd043f323c99da03b._comment | 25 + ..._4a7d824b6e75693cf47f6efbf2c99e2e._comment | 10 + doc/bugs/git-annex_broken_on_Android_4.3.mdwn | 7 + ..._e47c073f1614f7b57f86acedeeb1cadc._comment | 8 + ..._ce34578c45060b7c8b759efd1c1d8df8._comment | 13 + ..._75965395dc33046ce34ac5ba972b7d64._comment | 8 + ..._f07bc76dd3c5580fc0855a33ae835c8d._comment | 12 + ..._637c59becc68a1e4f60069d8873489ff._comment | 8 + ..._d80b87055f72873f5678a01d2630bea4._comment | 10 + ..._57ac84868b223b30f005704eefa01b8d._comment | 8 + ..._a41f4d8a72c07ad770e6479e9b8c7f1d._comment | 8 + ..._7d36637f11cda51de395303d5c1c6a3f._comment | 8 + ..._c8609c3f7f62ae5427fd8c60bc9546ed._comment | 8 + ..._0ffb3833ce2c2e0320468dc9a09866d7._comment | 10 + ..._0886bca6d0c6a9415a7794d256be2e9d._comment | 14 + ..._2b39729f95c9c4bba620ecdd3d1558ed._comment | 8 + ..._8d90d92951919aa70638b31e9248bec5._comment | 16 + ..._6398271f5cd9e94996202ef3bce6f6ed._comment | 20 + ..._c9e399833cc6235077161f490dfa866f._comment | 8 + ..._cf093737eefb2b99f6f0eac9bf3e74b3._comment | 9 + ..._c122ce53175fc9e0e114a8acd2385c0d._comment | 29 + ..._237e41e61781bb058f5fd39362a904e4._comment | 10 + ..._97f423a41ee9d2d74291594fae20dd4e._comment | 10 + ..._7b3fbe7e38f637fcea511441ac243d93._comment | 10 + ..._53e2d095b2501844cadec910de286814._comment | 14 + ..._26c04584c3c6dacf59e1b6c82042c97c._comment | 8 + ..._ddc9cbae1a721400a9acf2153e18f4f0._comment | 8 + ..._593235735e32238094121b1f79355bbd._comment | 8 + ..._f806fd5930e90920db24456297465bae._comment | 9 + ..._5741b6a5997328fdcd5cc99f841b18d3._comment | 8 + ..._3e0d9949dd810069af0b8076807e5924._comment | 8 + ..._f58897eff6b4693f0c73474ccfe6e733._comment | 8 + ..._ddba87b2f20d8a63f7b8ebdb9bd13515._comment | 18 + ...c_transfer_is_interrupted_and_resumed.mdwn | 47 + ..._0fc5c7251ead7a0fbbcd357a8bc53f05._comment | 18 + ..._992c1a51d0300bd676cb431688efa524._comment | 13 + ..._3001a11839eff6a4c3a9f12096b29704._comment | 8 + ..._a13abb45b9a94d275177641db0538765._comment | 10 + ..._faac2d48950307ce245f0da501ace730._comment | 9 + ..._7df03eee7d5dc5a7ed0c9abef5053788._comment | 17 + ...stall_on_windows_without_admin_rights.mdwn | 24 + ..._2533800ab5a95c5d71c3b47a630e751a._comment | 10 + ..._5b71785acf16a8d9ea457726599daef3._comment | 8 + ..._63e4ff79bc683a70dd9a85c66e26e56a._comment | 8 + ..._initialize_under_Windows_with_cygwin.mdwn | 40 + ..._24d626923403b097f57bc3d3a8c5befa._comment | 10 + ..._32a74f078f45ee069a7d386734e379e2._comment | 8 + ..._nautilus_script_directory_is_missing.mdwn | 49 + ...ows_bad_settings_with_standard_groups.mdwn | 25 + ..._b3090201e90a78e049cf299fc322d60e._comment | 12 + ..._of_my_files___36____35____38____33__.mdwn | 58 + ..._5dd4d1cec069c13184f5dd9efca6721b._comment | 8 + ..._d9b65fe4cb4bfd58f37e7da5350c6401._comment | 14 + ..._1027187b203addd65af8cf1faf28727d._comment | 10 + ..._ac65028203ff0cbdb978200235fb4e9c._comment | 10 + doc/bugs/git-annex_merge_stalls.mdwn | 18 + ..._31578a754945bdcb902c62ff58704bcb._comment | 17 + ..._f3b6bf180466b5931bfd20b2f0229422._comment | 10 + ..._ced9b0d724fb55c756106b64c3721003._comment | 18 + doc/bugs/git-annex_opens_too_many_files.mdwn | 42 + ..._37f6f5838c41c533df4be1f927b9b03d._comment | 26 + ..._347ef233b9845b84d7c4d49ed166e797._comment | 10 + ..._d5f644d97cd2db471deb5dcd728cae60._comment | 8 + ..._c03bde64be8fdd962826bc7afa07d2a9._comment | 137 + ..._33a2e783e5355e981497b9861997570b._comment | 18 + ..._b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment | 15 + ..._d73454c9ab3729989e4bc3f2223ccde9._comment | 8 + doc/bugs/git-annex_remotedeamon.mdwn | 27 + ..._bf8aa639ddc7f51ed7b2b83e31694e85._comment | 12 + ..._82f71852df61d12333d08ba25af9d7be._comment | 10 + ...ng_up_all_available_RAM_after_startup.mdwn | 49 + ..._b550f292359b44977481bf69abad4012._comment | 14 + ..._76e6c1d4db27bcc1767ba34e13e8211c._comment | 8 + ..._14007c8e927b75c5706e80cc4242fae4._comment | 8 + ..._f3266b74517b421e5310e67818fe3969._comment | 12 + ..._1a07f15eb0353768c1e67a1e47e2e494._comment | 9 + ..._7d0d49fd165af5e30606982e05335d34._comment | 10 + doc/bugs/git-annex_sync_does_not_push.mdwn | 52 + ..._8b9b53163b012563b3e80f8eded76aaa._comment | 10 + ..._the_directory_I__39__m_in_disepeared.mdwn | 15 + .../git-annex_webapp_command_not_found.mdwn | 25 + ..._6fa63ae1a7affb2351eda57ab3b4eda1._comment | 10 + ..._d25232bb5eaff725281869d7681e81ad._comment | 8 + ..._f593752a0c5c60daaacca46ced5ac5d8._comment | 12 + ..._e4ef964274e74cb4a39dc8ecac8ceade._comment | 12 + ...map_failed:_No_such_file_or_directory.mdwn | 43 + ..._984f75d8078f2809486f38ecb3b16be3._comment | 10 + ..._c0f07e2d4bb142389629050479dd1465._comment | 10 + ..._7a58a884aaacedca9697b17cd5248214._comment | 33 + ..._aa4f1806207138115d2a95935bb0546b._comment | 8 + ..._fa95f93416e3d6e66af557df6562f1e5._comment | 8 + ...he___124_____40__pipe__41___character.mdwn | 27 + ...annex_copy_--fast_does_not_copy_files.mdwn | 22 + ..._working_as_expected_in_the_assistant.mdwn | 140 + ..._ab82b880bd75a206e0717146e1b79aba._comment | 8 + ..._460e78ea8603bd87203d8014bcc3eb9a._comment | 55 + ..._17e9c2d29ddadcabc30ce884ffe0f853._comment | 12 + ...es_when_authenticating_with_jabber.de.mdwn | 26 + ..._5ba4f22bda2f5438fb08753cf149b649._comment | 12 + ..._b096cfdf26bfedfff16d882d7b2e060d._comment | 10 + ..._210be77aabb0ef5b85865cd08c51861e._comment | 12 + ..._bb974d882fbb31aa54e6de38410a2318._comment | 8 + ..._be655cbea27b6c87d298a75e1697a87d._comment | 8 + ..._72d1dac6627bbe22d5bd140215d82c47._comment | 8 + ..._8a8dfb15684525e156d6334e9f67a55c._comment | 66 + ..._f1a6e413756066659020e20147373a11._comment | 8 + ...40__notably_including_dead_ones__41__.mdwn | 44 + ..._7ee08a60e4b2516c010d3c2163049681._comment | 15 + ..._c29525bfda08717f68aaac83014e6b08._comment | 8 + ...ex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn | 220 + ..._141819a6b67de2602673698f6f148106._comment | 13 + ..._8be96359fd2bd33ed2961e499dc2685e._comment | 12 + ..._26950a37e86d4dd83dd59fb2564d0a2e._comment | 11 + ..._cbf8150dbe0da64bde7f6af8e041eda8._comment | 8 + ..._0c203f90d911cf6869894dae89575a49._comment | 13 + ..._68cbb7268bdad73357da2d11e05d73c4._comment | 8 + ..._816d552f871a1b06306f04d575adb2e5._comment | 8 + ..._7905b097a9c582452fb04cdc88ed4285._comment | 14 + ..._bd5ac9bb2eaab66af6aa13b39172b49d._comment | 9 + ..._9881db7bb6fef4e47c54cdc23e995f17._comment | 13 + ..._4fb9d3de245dddab65fb1a53a67a095c._comment | 8 + ..._41e2ea458669f59f96b5860825745910._comment | 8 + ..._515039e321e0595f95430d8082bd54a5._comment | 20 + ..._9412236296871c570c66f5b4c7f9681e._comment | 10 + ..._e4e7d13be6c0bc63f426e535de6172f8._comment | 8 + ..._c73e1277c5f284b1019362fb2bef94a8._comment | 8 + ..._f513259a2641e00b049203014ab940c8._comment | 12 + ..._54ee7b90467fee8b0457e9c447747500._comment | 10 + ..._7e6223c2dae3346e17276c7bbb01d53e._comment | 12 + ..._13b6e595d595da7f036e81258a65541e._comment | 8 + ..._94144c0cbdbccc72c13e12daf7657a29._comment | 8 + ..._9eb064ffdc3fdb70e85572185e151a3f._comment | 8 + ..._cde756e8a9b18fe2ca9cda25967bc7fb._comment | 10 + ..._1fd6a4374a334bc03914c3e0df95ef95._comment | 10 + ...remote_gcrypt_failure_leaves_a_remote.mdwn | 31 + .../git_annex_ignores_GIT__95__SSH__63__.mdwn | 24 + ..._whereis_and_uncommited_local_changes.mdwn | 30 + ..._99e8d2c1bbc23438f954d8ddc827078e._comment | 9 + ..._7c8d91d78608d717164cb3e825654654._comment | 10 + ...problems_with_urls_containing___126__.mdwn | 46 + ...__39__t_use_.gitignore_in_direct_mode.mdwn | 18 + ...ync_--content_not_syncing_all_objects.mdwn | 33 + ..._36deea0f1277d6888c8bb79156c56efa._comment | 16 + ..._70804d50b07630fadfc029a22173c5a0._comment | 14 + ..._d7349af488008e3ca6557e0c1fbfc5b6._comment | 9 + ...nch_of_files___40__not_expected__41__.mdwn | 42 + ..._e25451863622eefed664f6a210cbe67d._comment | 72 + ..._f49e6f4016b3a6f918961a2412902e03._comment | 12 + ..._a234e4f58d2cc3b0110e4e65aceeb2c3._comment | 20 + ..._a01a867500fd94e6b317e74a0b0b1401._comment | 8 + ...ect_mode_does_not_honor_skip-worktree.mdwn | 37 + ..._69baeb997086c885f34fd1dc385cf5d6._comment | 12 + ..._fb8c0bebb9aaa75ee7eaf6999b1db49e._comment | 10 + ..._6bfd4e9a7853af93e72b717249de9439._comment | 8 + ..._a7eab4171af7e46bcc637aacf630e9db._comment | 8 + ..._cb98789c50c58f01055183dbaf7b4eba._comment | 11 + doc/bugs/git_annex_unlock_is_not_atomic.mdwn | 7 + ...nex_unused_failes_on_empty_repository.mdwn | 15 + ...acter___40__and_probably_others__41__.mdwn | 33 + ..._861506e40e0d04d2be98bbfe9188be89._comment | 12 + ...app_--listen_on_a_remote_linux_server.mdwn | 50 + ..._db99c00830d3f15ebe790c4dc8b60bd7._comment | 8 + ...nd_has_tons_of_redundant_-a_paramters.mdwn | 15 + .../git_mv_before_commit_breaks_symlinks.mdwn | 28 + .../git_rename_detection_on_file_move.mdwn | 14 + ..._5ec2f965c80cc5dd31ee3c4edb695664._comment | 8 + ..._0531dcfa833b0321a7009526efe3df33._comment | 26 + ..._7101d07400ad5935f880dc00d89bf90e._comment | 27 + ..._57010bcaca42089b451ad8659a1e018e._comment | 8 + ..._79d96599f757757f34d7b784e6c0e81c._comment | 34 + ..._d61f5693d947b9736b29fca1dbc7ad76._comment | 12 + ..._f63de6fe2f7189c8c2908cc41c4bc963._comment | 19 + ..._7f20d0b2f6ed1c34021a135438037306._comment | 10 + ..._6a00500b24ba53248c78e1ffc8d1a591._comment | 21 + ..._75e0973f6d573df615e01005ebcea87d._comment | 9 + ...for_DCIM_on_Android_misses_some_files.mdwn | 17 + ..._f683ecf93e5a17c5c9c06225dbcce2a9._comment | 12 + doc/bugs/glacier_from_multiple_repos.mdwn | 16 + doc/bugs/googlemail.mdwn | 16 + doc/bugs/gpg-agent.mdwn | 5049 +++++++++ ..._86860841aaa38541968693ec02f6a506._comment | 10 + ...does_not_ask_for_password_inside_tmux.mdwn | 25 + ..._053b12e8b412723ff1d6b4e64e71af9e._comment | 24 + ..._44830ba952cad3b153249bd405671507._comment | 10 + ..._a63db33a1dc70e64418de8b4bea6a9fa._comment | 11 + ...es_to_100__37___cpu_on_bad_input_data.mdwn | 18 + ..._889218fb7c0115b03d9bad0c07296097._comment | 36 + ...w_to_get_git-annex_shell_on_MAC__63__.mdwn | 27 + ..._780fbb7b8dda331503064dfa6bcabaa3._comment | 23 + ..._1785e99846998aa50e1c62a88b558196._comment | 14 + doc/bugs/id__95__rsa_on_android.mdwn | 32 + ..._58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment | 8 + ..._7039ed326c92211aa92e9276aba8c6b6._comment | 12 + ..._cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment | 10 + ...uction_on_OSX_for_5.20131230-g9a495e6.mdwn | 25 + ..._515682c2338c861580105e869df648a1._comment | 8 + ...__96__.tmp__96___files_if_interrupted.mdwn | 12 + .../import_memleak_from_the_assistant.mdwn | 1608 +++ ..._81c80ca3ea288c651ccf45c83477e058._comment | 10 + ..._56089b7ad5d02c39ae0aacb442d789e9._comment | 16 + ..._b193a4a0901c681b59a97b93b456765b._comment | 15 + ..._d9464c7dc41773650ef7291391e1b414._comment | 10 + .../leakafter.png | Bin 0 -> 43348 bytes .../leakbefore.png | Bin 0 -> 24006 bytes doc/bugs/inconsistent_use_of_SI_prefixes.mdwn | 55 + ...mental_fsck_should_not_use_sticky_bit.mdwn | 17 + ..._204f45a43cd10bcb45c4920a13d66e8d._comment | 28 + ..._a8bb264cb2ceece72e0dd9191b2b566e._comment | 8 + ..._c6c8d3c84afa497bfdfe25b492dac5b9._comment | 12 + ..._5ac5a10bdddf23153e8ea0a8eb60323e._comment | 10 + ..._ec29ed50c4321cf9e21c56c13c65156b._comment | 8 + ..._c7f1170b84f9ea4befe96cdfe3bdaa1f._comment | 8 + .../index_file_smaller_than_expected.mdwn | 53 + ..._d87ae8c4d384d2ce6d1286b51bfdeba1._comment | 17 + .../info_file_contains_wrong_version.mdwn | 20 + ...nce_with_Dropbox_results_in_data_loss.mdwn | 50 + ..._837c7ab2d31531ac8a61509225926814._comment | 20 + ..._fe852adc1d7d3062ace269ceb134f3ad._comment | 8 + ...ent___40__invalid_byte_sequence__41__.mdwn | 29 + ...sues_with_non-posix_compatible_shells.mdwn | 41 + ..._076948499a9d581a50da52b7690e5d4e._comment | 8 + .../links_in_firefox_do_not_always_work.mdwn | 26 + ..._5e506674f157e8ed612eca1f9adfa068._comment | 18 + ..._dfde57b433301e971c2d5b9e4d3c824a._comment | 12 + ..._2d090d6e67ba53ff7e5c0275274f9b3d._comment | 15 + ..._install_can__39__t_be_used_with_sudo.mdwn | 20 + ...l_doesn__39__t_create_git-annex-shell.mdwn | 62 + ..._8c20edd8c6483500f807528d616c6dfd._comment | 14 + ..._8b2cf0fe7219e0bc83fd326adbf26c8a._comment | 31 + ..._25fe06eb127e59a4a07aeb52a5cfeabe._comment | 8 + ..._ec78032ba62d6918baa2c0b07ead5b50._comment | 8 + .../manpage_has_slight_indentation_error.mdwn | 38 + ...e_causes_out_of_memory_on_large_repos.mdwn | 26 + ..._6d47485728ea65a9b555f8be7159dea5._comment | 10 + ..._06723d13ecdaf87de5ff2b209e3c5198._comment | 10 + ..._9f83ef190547b291a715cda55b7977d4._comment | 10 + ..._0e32ae0300472c56079cfbcd78a3e386._comment | 9 + ..._e8998716107e7ae8d0e8d332812517ad._comment | 14 + ...d_files_not_showing_up_in_unused_list.mdwn | 62 + ..._2cfbf6693b051c758fe5efa5ee885829._comment | 16 + ..._acb1abeb32c3aba8ba65151afbea753c._comment | 10 + doc/bugs/moreinfo.mdwn | 2 + ...__40__No_such_file_or_directory__41__.mdwn | 30 + ..._9fdeaa51ccc7c71dcfeea3ea783d3b50._comment | 9 + doc/bugs/no_git-annex_shell_on_Windows.mdwn | 28 + ..._988768c3e4f30c751034a0b0390cdd88._comment | 8 + ..._70a6c9af57eed4f8ceb3de63cbf8a5e6._comment | 10 + ..._7f48959c6242c5cc52e9d0a79fd3f85d._comment | 8 + ..._04b30dd9e510762ee547e7b45bdba660._comment | 12 + ..._beebbd4a41cccfc7aac3c19d76c3b978._comment | 8 + ..._957c5da5f336c7ef59e4149602471888._comment | 15 + ..._a8654cf656de55ccdcf40270a1ef4ca9._comment | 35 + ..._3c8bb1b1d67ca1a6e568e381d24a2574._comment | 16 + ..._03646c9df9d4f4ea27459660fe65a976._comment | 25 + ...file_changed_to_annexed_on_typechange.mdwn | 40 + ..._6ac691645edb483797bee05043fd83b3._comment | 8 + ..._5d67e3a60b7cc30c2b1857f50895d363._comment | 8 + ..._78f1e081b92f418c20893d86a8715501._comment | 8 + ..._1e2a59e0eec89ef1a57d1488ff40dcf0._comment | 12 + ..._5e74431048b07631e0dbeca90fdb365b._comment | 47 + ..._3724e1c1a5fc6d3589452478249792ec._comment | 8 + ..._7f841ea7bf7d44f3d810ca097ac9eb47._comment | 8 + ..._c53ce2274388711ffbde1595b64f932b._comment | 10 + ...rd_output__41___from_git_annex_status.mdwn | 89 + ..._fcd230cbb2ac363c469b98021042c011._comment | 10 + ..._23207ecabd4b41d9551d0491fa71e96b._comment | 12 + ..._6ea92adfe955b6a5cd2a39fea78b3bf6._comment | 119 + ..._d0e55585f1612148163039d157253258._comment | 11 + ..._5506dc1b08516677886da4aa97263864._comment | 12 + ..._073449cc2cb73efd2b2d3d778a5573de._comment | 14 + ..._3516e71ba3b07427a10cbb4965712aa6._comment | 24 + ..._ea2e4704adb2f304f9c11c61eb62e919._comment | 8 + ..._4d17fedead7977541371a3f2c192e030._comment | 46 + ...ecated__44___but_still_in_walkthrough.mdwn | 21 + ...se__95__hiddenXXXXX_files_left_behind.mdwn | 52 + ..._b96ea3ece44d42e79e4d903ca66065ee._comment | 12 + ...nt_does_not_allow_spaces_in_filenames.mdwn | 31 + ..._ca10638d4b4b178cfd0de8736542c4dc._comment | 12 + ..._986a393a512229d35e529ba242b77b1e._comment | 10 + doc/bugs/problem_commit_normal_links.mdwn | 59 + .../problem_with_upgrade_v2_-__62___v3.mdwn | 3 + ..._5f60006c9bb095167d817f234a14d20b._comment | 8 + ..._cd0123392b16d89db41b45464165c247._comment | 23 + ..._86d9e7244ae492bcbe62720b8c4fc4a9._comment | 16 + ..._91439d4dbbf1461e281b276eb0003691._comment | 8 + ..._ca33a9ca0df33f7c1b58353d7ffb943d._comment | 8 + ..._f360f0006bc9115bc5a3e2eb9fe58abd._comment | 10 + doc/bugs/problems_with_android_and_gpg.mdwn | 73 + ..._526d8805cb1ae896e8b1920ac2aecc17._comment | 8 + ..._2e1ae66bac4f55b74074b09e22ab270d._comment | 16 + ..._47510400e8e45a71a1581aed99a157a1._comment | 12 + ..._d28d773450d09e03160548d99f12256d._comment | 12 + ..._74f1177d6dd42bab5ddfc040cbfb035e._comment | 10 + doc/bugs/problems_with_android_and_xmpp.mdwn | 82 + ..._dd56eb74660a606c7db54861ec745cc6._comment | 11 + ..._ae4554fadfc3ea1913a36aa535815cfb._comment | 12 + ..._128702a7974bd00337c3304e49a74f0b._comment | 23 + doc/bugs/problems_with_glacier.mdwn | 65 + ..._8d233428a16ae4276d9c69b329e8216b._comment | 12 + .../protocol_mismatch_after_interrupt.mdwn | 33 + ..._415de83053dc61a64cf2e301223f1916._comment | 11 + ...ce_then_stopped_running_opensuse_13.1.mdwn | 13 + ..._a9daf9e8f968b32f25e236f53ea4b845._comment | 14 + ...nishing_when_assistant_gets_restarted.mdwn | 34 + ..._53b4f388c47c1b3f6ffa4fc2155b30fc._comment | 21 + ..._e66532b23b089c9ea61122d6664cddb9._comment | 10 + ..._c9d692c867acc076f64f1213ea03ca11._comment | 8 + ...d___96__git_annex_sync__96___behavior.mdwn | 113 + ..._1a0b964f93c753838d6ccbdc8f79b39e._comment | 8 + ..._d22dcd7f95c5dc1c381c3c746781efce._comment | 8 + ..._a25140eb90f6b24c1a3ca39c901694e2._comment | 10 + ..._825e15183008ff7d97a81cacc3f55fb4._comment | 8 + ..._e858fc7c729cd39740354fb12627d556._comment | 10 + ..._9881b0f2dfb0907a60c0da296bc3da3f._comment | 10 + ..._ca017b9d3bafea4cb31448c802f3834e._comment | 8 + ...heir_symlink_targets_don__39__t_exist.mdwn | 67 + ..._8a1d16b2aaba224e94be3d9dcc036d91._comment | 12 + ..._434ed328a22a6657dba3b2929a56e499._comment | 18 + ..._1837b70ace42882db3ab82e001680934._comment | 29 + ..._ca9c87a10f29e41572540edeb99652f2._comment | 11 + ..._69eafc4201e3014ef1b5d74fe319e462._comment | 10 + ..._b7a64db9abe006af8c30169ad849efe9._comment | 76 + ..._197ac6070f256131c6e18a07aa3834fa._comment | 14 + ..._fe07832333b536c71b7dcb46a4a44bd0._comment | 19 + ..._540bca4e6fdfc10eeab875ecc0f2b3f3._comment | 10 + ..._3f236b35e9820cd88bb77fcd57d6975e._comment | 43 + ..._3cc5dae0351201522711a7caeecd60d5._comment | 10 + ..._3c3883cb66d02a15d5de84d22aa113da._comment | 38 + ..._c8cece9559bd2dc6154cd28772369e48._comment | 10 + ...ypt_based_repos_and_conflicting_uuids.mdwn | 30 + ..._11af589cf646cb7552eeb5c7401934f5._comment | 8 + ..._d81cb9b47dea34b639dc250bb231010a._comment | 16 + ..._8df00f0ed4a26f702e0935b366521530._comment | 164 + ..._7eb33c23223dfc634eb3c9c6621f7f3e._comment | 12 + doc/bugs/remote_not_showing_up_in_webapp.mdwn | 100 + ..._2a269732fd528f505777542d3556437a._comment | 17 + ..._10638e99e2e11460f99266f56adbc1db._comment | 10 + ..._4aa72acc0938f7f824ba10f3f102e8bc._comment | 16 + .../repo_creation_fails_on_android_4.4.3.mdwn | 30 + ..._01e638ec9c6d74966d76b6ceb7c06bad._comment | 26 + ..._07c0f9387433b7107e9def2bfbed3039._comment | 8 + ..._caf4f02677ea9e7fe28dbace99aa6860._comment | 8 + ...es_which_have_names_containing_spaces.mdwn | 50 + ...ync_transport:_username_not_respected.mdwn | 43 + ...s_of_of_memory_adding_2_million_files.mdwn | 17 + ..._8b60b7816b9bf2c8cdd21b5cae431555._comment | 8 + ..._32908da23e4fb38a7d20b765a5ab4656._comment | 12 + ..._3cff88b50eb3872565bccbeb6ee15716._comment | 27 + ..._e991986eb8ae49d2e69f7ed7fd61485f._comment | 8 + ..._241ad838135a7a377374ca9ba90aec5c._comment | 8 + ..._744982b77cc867e9e3a7d638c7a653d6._comment | 12 + ..._9add4ee13b7ea846e6495c28da214269._comment | 8 + doc/bugs/set_metadata_on_wrong_files.mdwn | 90 + ..._074f124e5d313e90b3e9217325799587._comment | 8 + doc/bugs/signal_weirdness.mdwn | 50 + ..._--_please_seek_possibility_to_shrink.mdwn | 41 + ..._d2faaff98386433110dcf7aae87916b7._comment | 9 + ..._1359ddf1b5db4303f8bd219d3f07df3a._comment | 10 + ...failed_when_adding_remote_server_repo.mdwn | 44 + ..._52180983b59c247389a55a9523ec435b._comment | 14 + .../ssh:_unprotected_private_key_file.mdwn | 62 + doc/bugs/ssh_portnum_bugs.mdwn | 15 + ..._2026785c06e99b55158cd65c221eb598._comment | 10 + ..._76551dfcd29b54814809c434d7cb64af._comment | 8 + ..._ab49a0e307a29c7c20627bbb3b10ab1d._comment | 8 + ..._e0d96a43208453dc29373d0e045751e3._comment | 8 + ..._9ed44cdb79224dac6b000983d77d53f3._comment | 8 + ...h_the_annex_directory_exposed_to_http.mdwn | 20 + ...commit_with_alwasycommit___61___false.mdwn | 90 + ...est_failures_on_window_for_5.20131118.mdwn | 22 + ..._5a7a284625c12d54390fe4a4ec1d4211._comment | 188 + ...s_problems_on_non-linux_based_systems.mdwn | 20 + ..._1d38283c9ea87174f3bbef9a58f5cb88._comment | 10 + ..._bf112edd075fbebe4fc959a387946eb9._comment | 8 + ..._a46080fbe82adf0986c5dc045e382501._comment | 8 + ..._760437bf3ba972a775bb190fb4b38202._comment | 8 + ..._060ba5ea88dcab2f4a0c199f13ef4f67._comment | 10 + ..._548303d6ffb21a9370b6904f41ff49c1._comment | 42 + ..._7ca00527ab5db058aadec4fe813e51fd._comment | 8 + ..._881aecb9ae671689453f6d5d780d844b._comment | 8 + ...onfig_contradiction_causing_confusion.mdwn | 35 + .../typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn | 11 + ..._e8df4b36a89b37edd94f3a318ae93a32._comment | 8 + ..._3b2c3c84bd1910280c549a2ee1c622b9._comment | 8 + ..._repository_group_of___34__here__34__.mdwn | 13 + doc/bugs/undefined.mdwn | 5 + ...ository_when_using_annex-ignore_true_.mdwn | 25 + ...Buffer_containing_an_invalid_argument.mdwn | 87 + ..._004cb3015895ad67386276f3e1f0de0d._comment | 10 + ..._3fe298ebb3ff04d12f2528aa982d7084._comment | 24 + ..._9302536d1577c12337d714fa3a9ea7a1._comment | 10 + ..._c1c8de66192957b7026d99b9ff90589c._comment | 16 + ..._8c2dad766e4115073d49b698919b5ed5._comment | 8 + ..._8da2a73381309ecef4b2796d8f2bb0bb._comment | 10 + ...ed_.git-annex__47____42___directories.mdwn | 16 + ..._9ca2da52f3c8add0276b72d6099516a6._comment | 10 + ..._e14e84b770305893f2fc6e4938359f47._comment | 18 + ..._ec04e306c96fd20ab912aea54a8340aa._comment | 8 + ...ploads_queued_to_annex-ignore_remotes.mdwn | 34 + ..._fa1c98f38253db8c2be3604c72eb3726._comment | 17 + ...g_encryption_with_multiple_keys_fails.mdwn | 57 + ..._584390159278577da78b05bc7bb0e673._comment | 10 + ..._51855f5bb857e1b6bc5531cdd7073c31._comment | 10 + ..._3a6ff3dbc24850b065d045c7c9398eb1._comment | 20 + ..._84168b56288262e01280da59ffaf19f6._comment | 8 + ...te_format_generates_irritating_output.mdwn | 30 + ..._fceba878f1097e27f056580e8d6d5b31._comment | 26 + ..._416992874813f120721a56d88b2bef65._comment | 9 + ..._a20f470c5226ac5693eb15146a02b3f5._comment | 8 + ..._a81f06191bc03a7aad5929af99f0634e._comment | 28 + ..._7438caecf78b4fb5d21f9f31dff95cf2._comment | 14 + ...web_app_loops_over_a_non-addable_file.mdwn | 56 + ...ifficult_to_abort_adding_a_repository.mdwn | 24 + ...26____47__annex_isn__39__t_a_git_repo.mdwn | 29 + ...ls_mysteriously_on_newer_repo_layouts.mdwn | 34 + doc/bugs/weird_unicode_bug_on_windows.mdwn | 17 + ..._69af9bd8c7898fccc2219edd860d547b._comment | 12 + doc/bugs/wget_and_android_4.4.mdwn | 27 + ...nnex_delete_non_annexed_new_git_files.mdwn | 55 + ..._6c9f5fe14e46ac96254426e1e9cff23f._comment | 8 + ..._04dfbf4b1f6b545075d50f43b1d73ef6._comment | 9 + ..._f449f259f076ea1b11bd289bdbcc9339._comment | 13 + ..._78ccd70a17d776f14ea9193ab55c6732._comment | 10 + ..._95fcc19327b57222844302bb81236ee9._comment | 8 + ...lable_both_here_and_in_another_remote.mdwn | 30 + ..._d823b7ee32183fbadd4a49f65e1a3a8b._comment | 8 + ..._f430538101f0ef6114b5e953248fa599._comment | 8 + ...uts_no_informaiton_for_unlocked_files.mdwn | 46 + ..._47bd0fc8d1c65f8a868d9722e66c71db._comment | 10 + doc/bugs/windows_install_failure.mdwn | 33 + ..._f339574c7cfa35c1f0dfd515fde457f5._comment | 8 + ..._1d3364d8f5c4963f3a7e473298ec6ed1._comment | 8 + ...tube_support_suddenly_stopped_working.mdwn | 62 + doc/builds.mdwn | 44 + doc/coding_style.mdwn | 92 + ..._70521cf79ad06832b1d73fc2c20c68ec._comment | 20 + ..._a820b7c8ae7c2290eb000f61bdb5c514._comment | 8 + doc/comments.mdwn | 9 + doc/contact.mdwn | 11 + ..._12d60f767d90bea94974e1ff6b206d31._comment | 8 + ..._95b6d868b913418de50ba121d71d2390._comment | 10 + ..._2cf43bd406673294e6cdbd785c4a0d0c._comment | 16 + ..._586a506e27379d74fbc0f4b654e89c7d._comment | 10 + doc/contribute.mdwn | 38 + doc/copies.mdwn | 35 + ..._af9bee33777fb8a187b714fc8c5fb11d._comment | 8 + doc/design.mdwn | 6 + doc/design/assistant.mdwn | 45 + doc/design/assistant/OSX.mdwn | 13 + ..._9290f6e6f265e906b08631224392b7bf._comment | 14 + doc/design/assistant/android.mdwn | 42 + ..._316bde8d22628e5e9d4f8dabce1d2ad4._comment | 14 + ..._8be9a74e5fc4641c2bf2e1bb7673dd59._comment | 8 + ..._3dd386ac1b757c73d14f14377b9eedd4._comment | 8 + ..._5dca47a4599d6e88d19193701c5a571b._comment | 46 + ..._054f06311e2b51d73be569f181eb004f._comment | 10 + ..._bb3d36e9d29f2fa77bee6d47ef9917fe._comment | 21 + ..._fee32a831eeb5736fe1dce52e30320c8._comment | 16 + ..._d8e9b0a5287fc96b19dc2cb9da3586ce._comment | 17 + ..._79a7b5bb5f4aaeea4a4e8ced0561701a._comment | 11 + ..._55ea70a6929523d26248ff6409b04a6e._comment | 10 + doc/design/assistant/blog.mdwn | 11 + .../blog/day_100__cursed_clouds.mdwn | 19 + .../day_102__very_high_level_programming.mdwn | 37 + ..._c028b403261dd66bcf83e6ffd134b80b._comment | 8 + .../assistant/blog/day_103__bugfix_day.mdwn | 25 + doc/design/assistant/blog/day_104__misc.mdwn | 18 + ..._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 + .../day_108__another_zombie_outbreak.mdwn | 33 + ..._194c48d65993462f809a2cfaa774a3e2._comment | 11 + ..._ef5ee5933fcadcb81cc81b816db14bda._comment | 8 + .../assistant/blog/day_109__dropping.mdwn | 16 + doc/design/assistant/blog/day_10__lsof.mdwn | 54 + ..._9b8c28c85c979f32e5c295b6a03c048e._comment | 9 + .../blog/day_110__more_dropping.mdwn | 55 + .../blog/day_111__config_monitor.mdwn | 18 + ...ow_for_something_completely_different.mdwn | 50 + ..._5e4fe1538d9ae1c450b0a6602fc6d29b._comment | 10 + ..._c5a734f611ecc95729904e645583ee43._comment | 8 + ..._46b16dcd0fce07036cd8ed6ed9d2b055._comment | 8 + ..._1fe036e4c65fb4211aa2c394f535344a._comment | 8 + ..._e4ba3568c4efd98f212dd47427a1cf47._comment | 10 + .../blog/day_113__notifier_work.mdwn | 22 + doc/design/assistant/blog/day_114__xmpp.mdwn | 56 + ..._c2b0617a2fc3dc4f19a6be6947913842._comment | 8 + ..._d14375dfb5791615802dab3c5438f8e2._comment | 8 + ..._6d72ea32c111e605be30ad2153fc71c9._comment | 10 + ..._e51d6f854db5f9e74a1aa58bd8923795._comment | 12 + .../assistant/blog/day_115__my_new_form.mdwn | 17 + .../assistant/blog/day_116__the_segfault.mdwn | 25 + .../blog/day_117__new_topologies.mdwn | 41 + .../blog/day_118__monadic_discontinuity.mdwn | 15 + .../blog/day_119__time_for_testing.mdwn | 12 + .../assistant/blog/day_11__freebsd.mdwn | 50 + .../assistant/blog/day_120__test_day.mdwn | 2 + .../assistant/blog/day_121__buddy_list.mdwn | 10 + .../assistant/blog/day_122__xmpp_pairing.mdwn | 29 + ..._e95efb23eb2e67e3f11a5c7de56424a7._comment | 10 + ..._30e251e73146512bde8b2f69eddeef2e._comment | 8 + .../blog/day_123__xmpp_insanity.mdwn | 49 + ...ay_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 + ..._ee1361e6b235f4e1c00596ba516b519a._comment | 10 + ..._8eb366ae7efb347bd3bbd9a98e0821b3._comment | 8 + .../assistant/blog/day_127__xmpp_syncs.mdwn | 35 + .../blog/day_128__last_xmpp_day.mdwn | 49 + ..._fd8c1d6358cb50f4dad8ba11d33d861f._comment | 10 + ..._43664b73c71c41d71bc95e665f128106._comment | 8 + ..._d369b04f686009a9dbb57b999107a55e._comment | 11 + ..._095855d301e7ccd3689ffe507cfb63ee._comment | 8 + ..._da7b0586b0b28e1e0fe4126f6543a7bc._comment | 9 + ..._2f9ba367e19d77bf52f372b6f0f5938a._comment | 8 + .../assistant/blog/day_129__release.mdwn | 4 + .../assistant/blog/day_12__freebsd_redux.mdwn | 23 + ..._5da32cf53f1de27bfe6cec2d294db3e1._comment | 8 + ..._696d6e22034acf5bb60d80124b72ef2f._comment | 8 + .../assistant/blog/day_130__what_now.mdwn | 36 + ..._402f00cc034351d8253a797dd4de55bf._comment | 8 + .../blog/day_131__webdav_groundwork.mdwn | 28 + .../blog/day_132__webdav_continued.mdwn | 22 + .../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 + .../assistant/blog/day_137__Glacier.mdwn | 30 + doc/design/assistant/blog/day_138__back.mdwn | 25 + ..._65a8499b284bed38d2bde1886a54a311._comment | 8 + .../assistant/blog/day_139__catch_up.mdwn | 11 + .../blog/day_13__kqueue_continued.mdwn | 34 + .../blog/day_140__release_monday.mdwn | 25 + .../blog/day_141__release_tuesday.mdwn | 6 + ..._a5adea7a726df12f9121c744a036f08d._comment | 10 + .../assistant/blog/day_142__filling_in.mdwn | 9 + .../assistant/blog/day_143__what_next.mdwn | 22 + ..._40cf25a2ebdd43d8974a28e180e100e5._comment | 13 + ..._af9ccbbc5131e6333c029415141bdb51._comment | 10 + .../assistant/blog/day_144__webapp_work.mdwn | 8 + .../blog/day_145__more_webapp_work.mdwn | 12 + .../assistant/blog/day_146__meanwhile.mdwn | 22 + .../assistant/blog/day_147__direct_mode.mdwn | 36 + ..._0bd69532afce9dc04e3d88bfd0aed4b2._comment | 16 + ..._3b26f0d081c3bf1037bb872d529ce825._comment | 8 + .../assistant/blog/day_148__direct_mode.mdwn | 42 + .../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 + .../assistant/blog/day_152__bugfixes.mdwn | 18 + ..._46863a875f9daa6f2c9248b66ff91929._comment | 9 + ..._a586e617bc024c8a9ff60f1b8345d74d._comment | 8 + .../assistant/blog/day_153__hibernation.mdwn | 26 + .../blog/day_154__direct_mode_merging.mdwn | 21 + .../assistant/blog/day_155__bugfixes.mdwn | 15 + ...ay_156_and_157__direct_mode_assistant.mdwn | 45 + .../assistant/blog/day_158__fsevents.mdwn | 20 + ..._b278372ac6399f64d5fa9da178278a6d._comment | 8 + ..._2d5ce9b2807068c3517e185945662bd2._comment | 8 + .../blog/day_159__fsevents_and_assistant.mdwn | 16 + ..._b85f446c3fa8d703a2a8882825c6f33f._comment | 8 + ..._a150b404e0c39e0bb2f7dd00cda63cdc._comment | 8 + ..._37abc41bae23a1d7de0d19d952aec492._comment | 8 + .../assistant/blog/day_15__its_aliiive.mdwn | 33 + .../day_160__finishing_up_direct_mode.mdwn | 10 + .../assistant/blog/day_161__release_day.mdwn | 8 + ..._e82c67f3ce216618149537bba1e0b850._comment | 19 + ..._b1fe96fd818935c0497b78bb8ad32ffa._comment | 14 + ..._40bac0e1756aa77bb966c4654857141c._comment | 44 + ..._af65656b0d1179636937595868bb97b0._comment | 30 + ..._0c05caaaf9588e124585041bf5f45d75._comment | 20 + ..._5dfb5f428633d6062925f61af2b8829b._comment | 23 + ..._ac4effb381b08d94d4a2d2482e92c89a._comment | 13 + ..._32600e89e3098e52a1280895e03b3f86._comment | 13 + ..._07e5d0c3cad0ce2bd4943e53b61f1767._comment | 8 + doc/design/assistant/blog/day_162__UI.mdwn | 17 + .../blog/day_163__free_features.mdwn | 32 + .../assistant/blog/day_164__bugfixes.mdwn | 17 + .../assistant/blog/day_165__release_day.mdwn | 16 + .../blog/day_166__a_short_long_day.mdwn | 25 + .../day_167__safe_direct_mode_transfers.mdwn | 12 + ..._f1aa64fe803d8c14b250a4e98b88142a._comment | 8 + ..._5ce1db84c9ead713f1272c4975645b93._comment | 8 + .../blog/day_168__back_to_theme.mdwn | 18 + ..._f248780bfcbd0384d9d72c2633a4ea46._comment | 12 + ..._5beba073373b8e75a32d1fcfdc1a0782._comment | 13 + .../blog/day_169__direct_mode_is_safe.mdwn | 24 + ..._65f87656c4e6bc7cdb614f53961341c9._comment | 8 + ..._a116a402a126c62be54c06afd82439ab._comment | 19 + .../blog/day_16__more_robust_syncing.mdwn | 44 + ..._23e7a90429e4431f90787cd016ebe188._comment | 8 + ..._8e7e7cd27791bb47625e60a284e9c802._comment | 10 + .../blog/day_170__bugfixes_and_release.mdwn | 8 + doc/design/assistant/blog/day_171__logs.mdwn | 23 + .../assistant/blog/day_172__short_day.mdwn | 22 + ..._b75e26b77a23a45da1c4c3bca1399246._comment | 12 + .../assistant/blog/day_173__snow_day.mdwn | 22 + .../blog/day_174__last_weekend_before_AU.mdwn | 25 + ..._05a8fd47f54373331741cc869a53b0c3._comment | 10 + ..._fc8e65eef954c4caa8321c2fe8b711b7._comment | 8 + ..._399534f540d85cac067fbb7be9d373b4._comment | 8 + .../blog/day_175__pacific_features.mdwn | 15 + ..._c3ee4386f872b7c76aaecfa638b368cb._comment | 9 + .../blog/day_176__thread_management.mdwn | 13 + .../assistant/blog/day_178__bus_hacking.mdwn | 10 + .../blog/day_179__brief_updates.mdwn | 19 + ..._920a84457d40358507a3eb817a4568d9._comment | 8 + .../blog/day_17__push_queue_prune.mdwn | 19 + doc/design/assistant/blog/day_180__back.mdwn | 7 + .../assistant/blog/day_181__triage.mdwn | 23 + .../assistant/blog/day_182__it_begins.mdwn | 50 + .../assistant/blog/day_183__plan_b.mdwn | 19 + .../day_184__just_wanna_run_something.mdwn | 46 + ..._689adac7e26cb0b0a4e7ecc787cfd716._comment | 16 + .../blog/day_185__android_liftoff.mdwn | 20 + ..._b7d28010a72619a7e9a5ad4f2a0d6c07._comment | 9 + ..._ddeb24e86fafb7dae93142cc02767aad._comment | 10 + .../blog/day_186__Android_success.mdwn | 33 + ..._1629da240ca7db5f8a32059f561fd435._comment | 8 + .../blog/day_187__porting_utilities.mdwn | 22 + ..._0e6a3f4fe8e09f247fa04156bc60f8c7._comment | 8 + .../day_188__crippled_filesystem_support.mdwn | 37 + ..._32a296fce23ae4b1e18bd5a9964bf619._comment | 14 + .../blog/day_189__more_crippling.mdwn | 44 + .../assistant/blog/day_18__merging.mdwn | 82 + ..._7a553ad559519f3b3e3cd20115b4c44e._comment | 15 + .../assistant/blog/day_190-191__weekend.mdwn | 28 + ..._dbd692d12c14d08acd7d73a655b34e8b._comment | 10 + ..._c813830e53471a9732e010a748d574fc._comment | 28 + .../blog/day_192_193__more_porting.mdwn | 44 + .../assistant/blog/day_194__nice_moment.mdwn | 37 + .../blog/day_195__real_android_app.mdwn | 32 + ..._0112007552b30cd9bfeac614a1e399c4._comment | 10 + ..._230d3c169c713f613b9d607d84ce5092._comment | 12 + ..._8d74ad2a61c02272758d157282ad56ec._comment | 10 + ..._4f6bc0680f2debd638933968a26975e0._comment | 10 + ..._71539c62608866464e8faa76bc522a55._comment | 9 + ..._e1b205289721ae79ac7fbed2f44018b2._comment | 10 + ..._4bc0aeae4fa1116944644c64feaf9697._comment | 8 + ..._17bb6e7565d4c757f6c1e3514c22f47d._comment | 10 + ..._cd8a6bec0f7c6843dd11d3266f25f864._comment | 44 + ..._2d2eee4bcbbd1d069a80bff5edc90c3c._comment | 13 + ..._3d96568c469a8c53a982f304eae5e7d4._comment | 10 + ..._e8667c47d07fc842cf0fe2ebbfbc1c58._comment | 8 + ..._cf8da7720ddc20b05955ee671ca4acd5._comment | 8 + ..._f4709bdbc739182819b648fd6aa00531._comment | 36 + ..._e66af12c7eca0d457b8406e9fb4b69be._comment | 8 + .../blog/day_196__android_bugfixes.mdwn | 26 + .../blog/day_197__template_haskell.mdwn | 36 + ..._82d9f9508929d84abf7b718c59436ae8._comment | 18 + .../assistant/blog/day_198__bugfixes.mdwn | 11 + ..._5a15b5bad0f9ba2423d2aebe440ac0ea._comment | 19 + ..._36d94b838e5e65c85e7afaabe8a578f1._comment | 12 + ..._ae9b74341a3bc6e1e84d2c0ca4c5f612._comment | 10 + ..._5a4827227c03bcff3b1e4c44b531f816._comment | 12 + ..._9c5f4c85217e898be4c57c615e53c36f._comment | 8 + ..._bccf1abfb7f56d97673158f3ccfce511._comment | 9 + ..._6f1b51b002cc5d2b505d80e3e04bf6f3._comment | 8 + ..._8a3542437663028b17442818eba3f7c5._comment | 9 + .../day_199__wrapping_up_Android_for_now.mdwn | 26 + ..._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 + ..._40cfe9bfd9e611fd734dbb5aad348aa3._comment | 10 + ..._b26890fdae575d42170988073fb2e45d._comment | 8 + ..._710a30c5d31bf549833ecfe9a0997c94._comment | 8 + ..._b6f62ab7e810ba6d3a43f0ead370c79a._comment | 8 + ..._a68e1ed7829b49086c567d97ddc09912._comment | 8 + ..._39d3ad0a029fe56e96f97d28d17fbbd2._comment | 8 + ..._5b752d6a8d74e61190f09384b6108206._comment | 31 + ..._881274ae0d6230bb4cafa4151ad72b49._comment | 12 + ..._e220059be77cf0ef396f37a4f9ccf9b5._comment | 8 + ..._ec2152151188dd252cdb61c68cfc12e4._comment | 10 + ..._42572411617c287368482bb9dcf94324._comment | 18 + ..._6b69aa81a9ba4e07e547ed1869946d51._comment | 15 + ..._b070a2e4151d9fbf43d7906efa78515f._comment | 12 + .../blog/day_201__real_Android_wrapup.mdwn | 38 + ..._88b9950c51324f0bb89c5646b3170952._comment | 19 + .../blog/day_201__real_Android_wrapup/fib.png | Bin 0 -> 69535 bytes .../blog/day_201__working_web_server.mdwn | 31 + .../blog/day_203__procrastination.mdwn | 25 + .../blog/day_204__deprocrastination.mdwn | 62 + .../day_205_206__rainy_day__snow_day.mdwn | 12 + doc/design/assistant/blog/day_207__XMPP.mdwn | 7 + .../assistant/blog/day_208__bugfixes.mdwn | 17 + .../assistant/blog/day_209__The_Bug.mdwn | 23 + .../blog/day_20__data_transfer_design.mdwn | 22 + .../assistant/blog/day_210__spring.mdwn | 29 + .../blog/day_211__zooming_along.mdwn | 24 + .../blog/day_212__accidental_all_nighter.mdwn | 24 + ..._6ee1f8056eedb6eb18013faf8f5ec212._comment | 8 + ..._07c83d75bb105bb77ada07359ed0ea7a._comment | 8 + ..._2c904d33f4f14807fbe718a01e98800a._comment | 8 + ..._59ec5c1cab75df87293800a7a03fe9c6._comment | 8 + ..._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 + .../blog/day_216__more_bugfixes.mdwn | 42 + ..._299462bcdd0e4f6cd7895b5f40ca00ad._comment | 10 + ..._1913d65dfe4ba08379d82a4a2ca91c40._comment | 8 + ..._92c774599a78540ad398afcd1d05f7ce._comment | 20 + .../assistant/blog/day_217__nothing.mdwn | 2 + .../assistant/blog/day_219__bug_triage.mdwn | 14 + ..._c6b977a969cacdce62987a439b7686f5._comment | 16 + .../blog/day_21__transfer_tracking.mdwn | 28 + .../assistant/blog/day_220__performance.mdwn | 40 + .../blog/day_221__this_and_that.mdwn | 28 + doc/design/assistant/blog/day_222__back.mdwn | 16 + ..._f05b48231a1ee0cffba7d66e112e5551._comment | 8 + ..._4d5f003ccd81580017ebf0dc31bc9cda._comment | 8 + .../blog/day_223__progress_revisited.mdwn | 24 + .../blog/day_224__annex.largefiles.mdwn | 23 + ..._408e4021b18f7ff5548d2d19ab558922._comment | 8 + ..._b24d1da2bc4307ded0216daffb8f9336._comment | 8 + .../blog/day_225__back_from_the_dead.mdwn | 47 + ..._9ac37c3b5c4c72ec8a39dce00bcbe420._comment | 8 + ..._26125dd9ef2bd10b597d14b2c6180952._comment | 8 + .../assistant/blog/day_226__poll_results.mdwn | 28 + ..._1ed980472214be6d0a8cf55f37797fda._comment | 8 + ..._6823b0a9a8037f1a5214db4db98fb16e._comment | 8 + .../day_227__bigfixing_all_day_today.mdwn | 21 + ...228__more_work_on_repository_removals.mdwn | 27 + .../blog/day_229__rainy_day_bugfixes.mdwn | 17 + .../day_22__horrible_option_parsing_hack.mdwn | 34 + doc/design/assistant/blog/day_230__Mom.mdwn | 35 + ..._696bba2246c8a9e6ce4aed3071bcc96c._comment | 8 + ..._2fa295ab6db0828cb725cfcfb6777822._comment | 8 + ..._fafd7abec629290418334ddb015bf62c._comment | 10 + ..._450cac0f2e82c94fd34b527ae05ef1b8._comment | 8 + .../assistant/blog/day_231__insert_title.mdwn | 26 + .../blog/day_232__headless_webapp.mdwn | 22 + ..._0fdd77d143ecba6fdb9f75cb6fc37bfb._comment | 16 + ..._0784a2a73c3e2945f3d3f2577b3b9c9c._comment | 8 + ..._ccb9fa22422fb913b6a496ebe65c49fb._comment | 8 + ..._ceba4468760a2525960327698431cee2._comment | 8 + doc/design/assistant/blog/day_233__taxes.mdwn | 11 + ..._9473ffdc42595af9c293fbcd5a1cdb54._comment | 14 + ..._5feed8d7053ba03812ccda8c61fd9775._comment | 8 + .../blog/day_234__clean_shutdown.mdwn | 29 + .../assistant/blog/day_235__birthday.mdwn | 31 + ..._db558b071067c1e63cde05cca0551094._comment | 8 + ..._d1a2c1124781118267599457ae9e0512._comment | 8 + ..._b853508d1d15234958b9f4a39277e45c._comment | 8 + ..._73aad3398a43bc4d28bca9bf635fa757._comment | 8 + .../assistant/blog/day_236__evil_splicer.mdwn | 29 + .../day_237__gnome-keyring_craziness.mdwn | 29 + ..._0cb088b732881d1fa92493aa1fd93d43._comment | 8 + ..._b855fd710954beebaafe6d2bd03eb368._comment | 8 + .../blog/day_238__back_to_Android.mdwn | 11 + .../day_239__bugfixes_and_frustration.mdwn | 28 + .../blog/day_23__transfer_watching.mdwn | 25 + .../assistant/blog/day_240__it_builds.mdwn | 37 + ..._151840ae0020ea63b2f041488c905386._comment | 25 + .../assistant/blog/day_241__cleanup.mdwn | 14 + ..._0e283cdf66a25b3cc9423fe651084cb9._comment | 8 + .../assistant/blog/day_242__more_porting.mdwn | 4 + .../assistant/blog/day_243__in_the_field.mdwn | 21 + .../blog/day_244__android_porting.mdwn | 6 + doc/design/assistant/blog/day_245__misc.mdwn | 15 + ..._3a2976617bb0cdc206fb1397a2ef1177._comment | 8 + ..._e0f9704e91fedca8ff26356f354cc1c3._comment | 10 + ..._93003a0d0983efbdc046d7459be194b0._comment | 8 + .../blog/day_246__bug_treadmill.mdwn | 18 + ..._f76f653364fe2b97e85e8356c93b0fce._comment | 8 + .../blog/day_247__performance_tuning.mdwn | 16 + .../blog/day_248__Internet_Archive.mdwn | 28 + .../assistant/blog/day_249__quiet_day.mdwn | 7 + .../blog/day_24__airport_digressions.mdwn | 99 + .../assistant/blog/day_250__stymied.mdwn | 23 + ..._330a10d447ccc3db03fcbfe571dbb404._comment | 8 + .../blog/day_251__xmpp_improvements.mdwn | 34 + .../assistant/blog/day_252__release_day.mdwn | 6 + doc/design/assistant/blog/day_253__OMG.mdwn | 22 + ..._bbdc61092771163e65a90a4755a807d8._comment | 8 + .../blog/day_254__Android_app_polishing.mdwn | 35 + ..._37f4ff5227566ce4b3fa69fc32568841._comment | 14 + ..._58bbb105bdbb72bba85c3622195f43b9._comment | 12 + .../blog/day_255__Debian_release_day.mdwn | 26 + doc/design/assistant/blog/day_256__8bit.mdwn | 27 + ..._f9b50263e3997d4c5b9836a2e0a346d7._comment | 8 + .../assistant/blog/day_257__rainy_day.mdwn | 6 + .../blog/day_258__beginning_of_the_end.mdwn | 24 + .../day_259__Android_dominos_toppling.mdwn | 15 + ..._0b4a6e4893b0157e4768b46468dbbb87._comment | 10 + ..._1ebc5aff5d217e1392cb7c8bb6c5156b._comment | 14 + ..._eed7792f6142f3fc74d3c384bb16559b._comment | 8 + .../blog/day_25__transfer_queueing.mdwn | 41 + ..._59fd4f1ffe96c412f613dc86276e7dbd._comment | 10 + ..._93bf768a67117e873af5732ecf08dc78._comment | 7 + .../day_260__Windows_dev_environment.mdwn | 46 + ...day_261__Windows_first_stage_complete.mdwn | 29 + .../blog/day_262__DOS_path_separators.mdwn | 14 + ..._45ecae90b22e31202c21083980d6b567._comment | 10 + .../assistant/blog/day_263_catching_up.mdwn | 11 + ..._9023da0573dfc81644d68128adb331a7._comment | 8 + ...ay_264__Windows_second_stage_complete.mdwn | 21 + ..._42a7502d6ece75520eb59a76fdb1e2f0._comment | 9 + ..._f2b11322ac87e2a36cddc035b2c3c1ea._comment | 8 + ..._ea6ee05acb946fc7e8d95e62647cfa2a._comment | 8 + ..._9ce106baf28b7f75f7f6febd7bfcea70._comment | 8 + .../assistant/blog/day_265__correctness.mdwn | 23 + ..._e8959a6df87eb92310947e66c7471e97._comment | 12 + ..._0cb953fcc085eedb34e65c227309ede7._comment | 8 + ..._df57628a8969af2995732e7ea2a0fae3._comment | 10 + .../assistant/blog/day_266__release_day.mdwn | 6 + ..._92c8d1d9216b46b07dfe69bbc77a923e._comment | 8 + .../blog/day_267__windows_autobuilder.mdwn | 9 + ..._978b584d86395f2f621b0e1f7c5e70d7._comment | 21 + ..._8f978d2811c8fbf11e3d12f245bdb52b._comment | 10 + .../blog/day_268__core_monad_change.mdwn | 9 + .../assistant/blog/day_269__bugfixes.mdwn | 14 + .../assistant/blog/day_26__dying_drives.mdwn | 28 + .../blog/day_270__release_and_xmpp.mdwn | 39 + .../assistant/blog/day_271__more_xmpp.mdwn | 31 + .../assistant/blog/day_272__fuzz_tester.mdwn | 37 + .../assistant/blog/day_273-274__fun.mdwn | 19 + .../blog/day_275__working_hard_or.mdwn | 12 + .../blog/day_276__fuzzing_continues.mdwn | 12 + ..._f5dd0658511a1063c2eb025b0fe98426._comment | 14 + ..._a56c4c26a9e7bb8cfe3f598dbeed0813._comment | 10 + ...ay_277__private_static_protected_void.mdwn | 19 + .../assistant/blog/day_278__winding_down.mdwn | 11 + .../blog/day_279__final_release_prep.mdwn | 14 + .../blog/day_27__robust_transfers.mdwn | 31 + .../day_28-35__threaded_runtime_tarpit.mdwn | 17 + doc/design/assistant/blog/day_280__yesod.mdwn | 7 + ..._a42213a8cef71f2b54db18606028136d._comment | 8 + doc/design/assistant/blog/day_281__back.mdwn | 37 + ..._128809c5a2a9f5cc345a10fdbf55be01._comment | 8 + ..._6d0bbdf6ebaff9da399804570f0e606d._comment | 10 + .../blog/day_282-283__caught_up.mdwn | 18 + .../assistant/blog/day_284__porting.mdwn | 13 + ...285__fixed_the_archive_directory_loop.mdwn | 23 + ..._1065e756dc6d66aefd214eb8ac5ebe1d._comment | 25 + .../blog/day_286__Windows_test_suite.mdwn | 19 + .../assistant/blog/day_287__niceness.mdwn | 13 + .../blog/day_288__success_stories.mdwn | 32 + ..._9ddf57b8ae0241268bb33bec1b169e4c._comment | 20 + ..._50b8a597bd8677608f2ef176443f23f3._comment | 10 + ..._f2df427cf3608377e9a52d8bdeadb26f._comment | 21 + ..._8762efed97f21eeba8f0a7be45bd924a._comment | 35 + ..._55e1bb15c3a93d582d110f8173ceefc2._comment | 9 + ..._5749aef8b585b293385b20b75c40f9d8._comment | 31 + ..._911c6d2764906cad7d6324835441ed34._comment | 12 + ..._eb6aa8af5aa70877255a11d132d51aba._comment | 10 + ..._9a57de4cea407a73b2d023d85afdccc6._comment | 12 + ..._1767c86067bee35941004282b96b8e95._comment | 10 + ..._22b28ca3d4d3283ad8c21ae052fb9752._comment | 11 + ..._1d47f3e1b9f0081649cedae4288bac83._comment | 8 + ..._31d3f58cad83cb1ecc4821a15ca258d8._comment | 14 + ..._b512bd2bf29dfaab6b36bf204518fdb6._comment | 8 + ..._343333356de20e170edb8020faa7400d._comment | 10 + ..._4e4034bec789543b562ac263df3e21dd._comment | 15 + ..._0c52794c77a9b7afc5112f5edf9cb793._comment | 8 + ..._7ca419aa3a187857b19268572d5df297._comment | 18 + ..._3edd56b3b04f19faba8d75cca285a662._comment | 10 + ..._146331ae2de25a6dc3595dffab9514de._comment | 12 + ..._72be9307e75eb120451f3d6ab7c8165e._comment | 8 + ..._c27eb0a4181e85a3eed41130402350bf._comment | 12 + .../blog/day_289__back_in_the_swing.mdwn | 16 + .../blog/day_290__https_release.mdwn | 17 + doc/design/assistant/blog/day_291__--all.mdwn | 32 + ..._eaa9fef19a035bef9c439e87d47c834b._comment | 17 + ..._90bbc26bf92048de7cbaf5fb719c9593._comment | 11 + ..._75006e9909425dcbf86415a9f7c90372._comment | 10 + ..._5440449bbc5a353f7430f72e19c35e92._comment | 8 + .../assistant/blog/day_292__bugfixes.mdwn | 24 + ..._bbac3878d80f7540d229183c56664784._comment | 8 + ..._8c9e5291ceb257f3a938af0ad967c5d7._comment | 10 + ..._02f875e8edd30f47939249f16d92712b._comment | 8 + .../assistant/blog/day_293__gpg_builds.mdwn | 32 + ..._4f152de8ea5aca4ec381d439e2a821f7._comment | 12 + ..._42f625638638bc875379f6c604d6f673._comment | 8 + .../assistant/blog/day_294__release_day.mdwn | 7 + .../blog/day_295__balls_in_the_air.mdwn | 13 + .../day_296__new_crowdfunding_campaign.mdwn | 41 + ..._cccad1a5103c504d21d0f8e69bb39e1b._comment | 8 + ..._4fef7bd9c8e15cd57df365fadb95717f._comment | 8 + ..._0b9258a1f5079e53c60138f06d0c63b1._comment | 8 + ..._46183b97ca904bc06e46569c30db2edc._comment | 8 + .../assistant/blog/day_297__back_to_work.mdwn | 16 + ..._e300feb821bfe7b76b2cec4376d16ffa._comment | 8 + .../assistant/blog/day_298__exceptional.mdwn | 21 + .../assistant/blog/day_299__bugfixing.mdwn | 8 + doc/design/assistant/blog/day_2__races.mdwn | 45 + .../assistant/blog/day_300__new_logo.mdwn | 36 + ..._9fc64e33863b9fce00f6a03417a91e36._comment | 9 + ..._e8aac0298f90004e81492d2c7f85eda0._comment | 8 + ..._6308c767f6e4bf090102191c91520d04._comment | 8 + .../blog/day_301__direct_unannex.mdwn | 21 + .../assistant/blog/day_302_release_day.mdwn | 6 + ..._fe6e572ba706e95188463d9f3e004d03._comment | 17 + doc/design/assistant/blog/day_303__oops.mdwn | 8 + .../blog/day_304__dropunused_safety.mdwn | 28 + ..._1bbcf6c74b6437c44ff8604401fb1432._comment | 10 + .../blog/day_305__interesting_bugs.mdwn | 21 + .../assistant/blog/day_306__offtopic.mdwn | 2 + .../assistant/blog/day_307__buuuugs.mdwn | 31 + .../assistant/blog/day_308__ssh-agent.mdwn | 16 + ..._5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment | 12 + .../assistant/blog/day_309__filenames.mdwn | 17 + .../assistant/blog/day_310__release_day.mdwn | 18 + ..._1e008583cebd8e373e83729529914db7._comment | 8 + .../blog/day_311__Windows_porting.mdwn | 10 + ..._8e738f54a72557bee1e19970472b925c._comment | 8 + .../blog/day_312__DebConf_midpoint.mdwn | 30 + doc/design/assistant/blog/day_313__back.mdwn | 34 + ..._fbf3fdf9688c18156753d446facd942d._comment | 10 + doc/design/assistant/blog/day_314__quvi.mdwn | 27 + ..._3fdfb0742cb5422530ddd97b904f2a42._comment | 8 + .../assistant/blog/day_315__backlog.mdwn | 12 + .../assistant/blog/day_316__day_off.mdwn | 6 + doc/design/assistant/blog/day_317__misc.mdwn | 17 + .../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 + .../assistant/blog/day_3__more_races.mdwn | 26 + ..._d6015338f602b574a3805de5481fc45e._comment | 8 + ..._4d6b23fc6442e0ee0303523cb69d0fba._comment | 8 + ..._03f5b2344c2a47dea60086f217d60f9b._comment | 14 + ..._860e90e989ec022100001c65e353a91e._comment | 8 + doc/design/assistant/blog/day_40__dbus.mdwn | 100 + ..._43ed2a79629868b018ec9f54a32bcacc._comment | 12 + ..._6799f2baf6a6ce14b1fa76a8402840c0._comment | 10 + ..._fa1d7444bdafcb990cacf2ace7ee6ef1._comment | 10 + ..._3399ddad951c1a950281bb6941fc3f6f._comment | 8 + ..._40b6b9d741d3081203f0cc94eb8dc3ea._comment | 12 + doc/design/assistant/blog/day_41__foo.mdwn | 46 + ..._ace21fa257a4c2fd412b6ff2944a23e8._comment | 10 + .../assistant/blog/day_42__the_answer.mdwn | 27 + .../blog/day_43__simple_scanner.mdwn | 37 + .../assistant/blog/day_44__webapp_basics.mdwn | 83 + ..._d5fb67f373038e9f583cb2e1992bef67._comment | 18 + .../assistant/blog/day_45__long_polling.mdwn | 66 + ..._994bec0978324e268666073e8ff4f6ae._comment | 8 + ..._dfa164c86290899139491acccddd8b2b._comment | 10 + ..._5526c9dd4fd87da56cb8456083169f55._comment | 8 + ..._91630f5bf162dfd4fbb3920f1318535b._comment | 8 + ..._b3e41ba77f21e93a4e086483793bf5ce._comment | 10 + .../blog/day_45__long_polling/full.png | Bin 0 -> 55185 bytes .../blog/day_45__long_polling/phone.png | Bin 0 -> 41602 bytes .../blog/day_46__notification_pools.mdwn | 68 + .../blog/day_47__alert_messages.mdwn | 14 + doc/design/assistant/blog/day_48__intro.mdwn | 8 + .../blog/day_49__first_run_experience.mdwn | 39 + ..._e146cf06c8dd6303dd6a991f152a73fe._comment | 8 + ..._5d6adcf6782c02283bef6189582ee467._comment | 12 + ..._7ac2e34c2a7bc9b57488ca0c91307d32._comment | 14 + ..._549b07bb02c07a5b1b95445b01758db2._comment | 14 + doc/design/assistant/blog/day_4__speed.mdwn | 47 + ..._bf3c9c33cc0dea5eaeb6f2af110b924b._comment | 8 + ..._33aba4c9abaa3e6a05a2c87ab7df9d0e._comment | 8 + .../blog/day_50__directory_name.mdwn | 20 + ..._782cec95a8558a05b2b38a2d2302214d._comment | 8 + ..._2b8ceb0a26f25e8ed2711bcbe7225a58._comment | 8 + .../assistant/blog/day_51__desktop.mdwn | 34 + .../assistant/blog/day_52__file_browser.mdwn | 21 + ..._cd000c2d56b60cc1f17b221322a32aa7._comment | 8 + ..._21d1da67cf9105a545583ba2302c10fb._comment | 7 + .../blog/day_54__adding_removable_drives.mdwn | 99 + ..._5de4f220a3534f55b1f2208d1d812d63._comment | 10 + ..._8dae1ed0a70acf9628b88692dc32ac5f._comment | 10 + doc/design/assistant/blog/day_55__alerts.mdwn | 10 + ..._6319045500a8a5e049304fdec5ff4cf4._comment | 8 + .../blog/day_56__transfer_control.mdwn | 8 + doc/design/assistant/blog/day_57__afk.mdwn | 40 + ..._70e1c9f925f040c1700d3e26bab373d5._comment | 9 + ..._c70d3faccfcebf47deb25e270498cb56._comment | 18 + ..._89020ebc6d31485339bdea41a872df3c._comment | 11 + ..._8b1f65f141ffd9813e7f5a3380f7f520._comment | 27 + .../blog/day_58__more_transfer_control.mdwn | 26 + doc/design/assistant/blog/day_59__dinner.mdwn | 10 + ..._0c1e2d69496473e7e4a2956a2814f5dd._comment | 9 + .../assistant/blog/day_5__committing.mdwn | 57 + .../assistant/blog/day_60__taking_stock.mdwn | 40 + ..._6722f81ee084f1ea9e8fe47f34576397._comment | 8 + .../day_61__network_connection_detection.mdwn | 36 + ..._09b58f41a8d48f218619711ee19511ac._comment | 8 + .../blog/day_62__smarter_syncing.mdwn | 21 + .../blog/day_63__transfer_retries.mdwn | 26 + ..._990d4eb6066c4e2b9ddb3cabef32e4b9._comment | 10 + .../blog/day_64__syncing_robustly.mdwn | 33 + .../blog/day_65__transfer_polish.mdwn | 33 + .../assistant/blog/day_66__the_merge.mdwn | 19 + ..._eeccf4e73cc321542a1fe4780805a81e._comment | 12 + ..._a34e89316d1662826848f31061c4e46b._comment | 8 + ..._09e244d23d05052fa2b11a7181888366._comment | 8 + ..._3961a03e167903959b96b054835613f6._comment | 8 + ..._12a57af9f580918818b4a9f68396d5c4._comment | 23 + ..._8ce638960012367c888e018a5f05db19._comment | 8 + ..._f461b856b940e6914bcd2b681cf9505f._comment | 13 + ..._6e73aca1fc1747d0e742e054b88b5d78._comment | 12 + ..._d85f1ce23ae16d5a8eb88d2c3999acb7._comment | 19 + ..._c06dab4d78122c85beeaf300ffc3e376._comment | 8 + .../assistant/blog/day_67__progress_bars.mdwn | 10 + .../assistant/blog/day_68__transfers.mdwn | 15 + ..._5282960c0b553fbc0f411345b9745324._comment | 14 + .../assistant/blog/day_69__build_fixes.mdwn | 7 + doc/design/assistant/blog/day_6__polish.mdwn | 50 + .../blog/day_70__adding_ssh_remotes.mdwn | 66 + ..._2fac85357ac8feccff82beabd3791439._comment | 13 + ..._e9e496005fd1bf5a10c9e286b83e51fa._comment | 8 + ..._913e6ae7c8f7db90b9767ec35fc84205._comment | 23 + ..._634ca3c236e2062289e7df5f0d77a3c5._comment | 8 + ..._e365bbcbb7f66ce2b35fcd5b969ab315._comment | 16 + ..._b15499722a655489f9ea60ff9d4c47c6._comment | 12 + ..._8ea48276f060e75d9f40617d2a1ccd08._comment | 12 + ..._9b8bf7e9fa715977fbeb98087deefd1a._comment | 10 + ..._42e09eacdc10c7cf579bfc6470b5117c._comment | 8 + ..._6c02f31063b3d399d1b4f823bd6543ce._comment | 16 + ..._dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment | 10 + .../assistant/blog/day_71__ssh_probing.mdwn | 26 + ..._56a0c29f7454cfca5cc30b2849e6e942._comment | 8 + ..._f3bd3e366c92c833c7e217da125481b8._comment | 8 + ...mote_ssh_server_configurator_finished.mdwn | 34 + .../blog/day_73__rsync.net_configurator.mdwn | 17 + .../blog/day_74__bits_and_peices.mdwn | 7 + .../blog/day_75__zeromq_and_pairing.mdwn | 50 + .../assistant/blog/day_76__pairing.mdwn | 16 + ..._09665f269343422cd18051fad1a8c19e._comment | 24 + ..._8e1b2233579bc26bfd758bbf6b3bdc07._comment | 10 + ..._a8b6a8432da20c468c633da8e7cbc2f3._comment | 8 + ..._36a428a2e1803f4391b821d1892f0cd7._comment | 10 + ..._11f332fe2050d8c1416e71f9e85ba280._comment | 8 + ..._973aeb656b78eca97474ea1a3f5b57b7._comment | 12 + ..._03d2b3343f34377a4d6171e06b7609f6._comment | 8 + .../assistant/blog/day_77_alert_buttons.mdwn | 21 + .../blog/day_78__pairing_continued.mdwn | 8 + .../blog/day_79__pairing_finished.mdwn | 33 + .../assistant/blog/day_7__bugfixes.mdwn | 45 + .../blog/day_7__bugfixes/profile.png | Bin 0 -> 47098 bytes .../blog/day_7__bugfixes/profile2.png | Bin 0 -> 230937 bytes .../blog/day_80__default_backend.mdwn | 14 + ...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 + .../blog/day_84__deferred_downloads.mdwn | 33 + .../blog/day_85__more_foundation_work.mdwn | 17 + .../blog/day_86__towards_the_beta.mdwn | 33 + .../blog/day_87__more_progress_progress.mdwn | 28 + ...ay_88__progressbars_still_progressing.mdwn | 18 + .../assistant/blog/day_89__final_polish.mdwn | 24 + doc/design/assistant/blog/day_8__speed.mdwn | 67 + ..._a3dba537b276d5737abc8cb93f1965f4._comment | 10 + doc/design/assistant/blog/day_90__beta.mdwn | 16 + ..._5f2a3b18ad7558abe04f51534a29ff13._comment | 9 + ..._961c4eba97f4eac75174244d6b2b00c0._comment | 8 + ..._c76675a4633cbbe347ed42c222918d38._comment | 24 + ..._f0b8f77cb691e747fe35bcf2f51b5baa._comment | 8 + ..._99fbc9feac62e66a12b0d357cf86ccc1._comment | 8 + doc/design/assistant/blog/day_91__break.mdwn | 7 + doc/design/assistant/blog/day_92__S3.mdwn | 23 + ..._eda656247d11cea7fbed2e33137a39e5._comment | 10 + ..._8249d2d9521e44c674da3fda74be077a._comment | 10 + .../blog/day_93__OSX_standalone_app.mdwn | 23 + .../assistant/blog/day_93__easy_install.mdwn | 34 + ..._d4f7de723c98577ef28d89ee6b87fd13._comment | 10 + ..._6337b341c1cfb2132b59704394e57b36._comment | 8 + .../blog/day_95__repository_groups.mdwn | 21 + .../blog/day_96__revisiting_file_adds.mdwn | 24 + ..._da3ca47041168b6c82aeb2c18acc5017._comment | 8 + .../assistant/blog/day_97__stuffing.mdwn | 14 + .../blog/day_98__preferred_content.mdwn | 44 + ..._2136618e3515d0ac6369a41f1934ec2a._comment | 17 + ..._5f6db00e69628bf2f72b0e6f2981a49b._comment | 14 + doc/design/assistant/blog/day_99_shotgun.mdwn | 70 + ..._12bb8f54bb13ea20ac4187a2301d77ca._comment | 10 + .../assistant/blog/day_9__correctness.mdwn | 30 + ..._564a39cb976767e2c0a9c74fabe10be4._comment | 8 + ..._77924e9d50b40f05e792e427a25849a6._comment | 9 + ..._92bd86cd06d579e23800af2e5c66a291._comment | 8 + ..._0d12b51ccdfc2a94d3e59a5628521e0a._comment | 10 + ..._208f9dd3e1d92555b05c29159538a901._comment | 14 + ..._90cc6b60718896fb175919417600fdf9._comment | 8 + doc/design/assistant/chunks.mdwn | 7 + doc/design/assistant/cloud.mdwn | 45 + ..._4997778abc171999499487b71b31c9ba._comment | 16 + ..._08da8bc74a4845e354dca99184cffd70._comment | 8 + ..._faafd1266301997b1822d215ec8e8d8c._comment | 8 + ..._3eb557d5439831f6e0032944d12c02cf._comment | 12 + ..._f2233fad55c20686cf299bf6788f1f23._comment | 10 + ..._a38f0f21c2346e65b786d791b6829f9b._comment | 12 + ..._5e991177d6577384f39a36ae02f5f574._comment | 13 + ..._f8625c6f43b58847840df338a73b7972._comment | 7 + ..._c37ef5931b0f5c1f808083e0d636a208._comment | 11 + ..._68c98a27083567f20c2e6bc2a760991b._comment | 9 + ..._8e6788c817c60371d2a2f158e1a65f87._comment | 8 + ..._97bdfacac5ac492281c9454ee4c0228e._comment | 8 + ..._53137b2df4913496c0afb2d895aa4ee2._comment | 8 + ..._ff1b0ba57e22ed757ec3fc5400b5e43e._comment | 8 + ..._a48fcfbf97f0a373ea375cd8f07f0fc8._comment | 8 + ..._099da245e3276fa84f5e14312d186621._comment | 8 + ..._6d3552414fdcc2ed3244567e6c67989d._comment | 7 + ..._05223be50c889b2ed6bc4abf74116450._comment | 9 + ..._fbbd93b55803ae21e6ba4b6568c2fafd._comment | 9 + ..._f4e9af3fed6c27e8ff39badb9794064d._comment | 12 + ..._c7ad07cade1f44f9a8b61f92225bb9c5._comment | 10 + ..._609d38e993267195a80fecd84c93d1e2._comment | 8 + ..._22b818e1a2a825efb78139271a14f944._comment | 10 + ..._d052e2142da8b4838fb1edf791ea23ae._comment | 10 + doc/design/assistant/configurators.mdwn | 20 + doc/design/assistant/deltas.mdwn | 9 + ..._bdb477af913c9782c0e8509e6b294b6e._comment | 8 + ..._71889d15ba20ebb0fe13080c68162a5b._comment | 11 + doc/design/assistant/desymlink.mdwn | 145 + ..._f1bfe250b7f872359f7075998b6e42e3._comment | 11 + ..._5e876edfe9853645f761b5ed9b5021aa._comment | 9 + ..._538561d74371e53c2f8df7f5ebdf58a8._comment | 8 + ..._586ecaa800e6c162377c937da5e65440._comment | 12 + ..._8fc703de67814cf2aec2a908852298a4._comment | 10 + ..._1b473ad89494afb82250af4b6df5f5c9._comment | 22 + doc/design/assistant/disaster_recovery.mdwn | 185 + ..._955dc807196863da23aa8dbd15e04364._comment | 10 + .../assistant/encrypted_git_remotes.mdwn | 22 + doc/design/assistant/gpgkeys.mdwn | 40 + ..._a14427f88c9fd8e25ad8708146bb4bff._comment | 15 + doc/design/assistant/inotify.mdwn | 234 + ..._3d3ff74447452d65c10ccc3dbfc323cd._comment | 7 + ..._a3c0fa6d97397c508b4b8aafdcee8f6f._comment | 7 + ..._b346e870c1cd80e4b0a313c3a9fed6b3._comment | 8 + ..._32be58b4c3b17a4ea539690d2fb45159._comment | 12 + ..._0cdd3046d90ad2012025d846ece0731e._comment | 8 + ..._e197d5d0d853572ec1f2e5985762e60d._comment | 9 + ..._00809aaad6b68f189a9cc42af810a0a6._comment | 8 + doc/design/assistant/leftovers.mdwn | 17 + ..._b20c88bb3c583a32023c1f6b6dc9486d._comment | 8 + .../assistant/more_cloud_providers.mdwn | 24 + doc/design/assistant/pairing.mdwn | 83 + doc/design/assistant/partial_content.mdwn | 36 + ..._58c4faa321a5bb71adf9fdee079849f4._comment | 18 + doc/design/assistant/polls.mdwn | 1 + .../assistant/polls/2013_user_survey.mdwn | 1 + doc/design/assistant/polls/Android.mdwn | 18 + ..._fa6c409833f28c67da105d25f4a440e0._comment | 8 + .../polls/Android_default_directory.mdwn | 7 + ..._d39655091ac3ed51a9d4325d86b23ad7._comment | 10 + ..._2f1eaae95075db26488517720afd1c63._comment | 8 + ..._b484012f60789be73d7d5b338cff6203._comment | 10 + .../assistant/polls/goals_for_April.mdwn | 17 + ..._9f81fa96db5970a4be0828c74a6d2d55._comment | 22 + ..._d8956d220ccacff3d2f6cbeb15718459._comment | 28 + ..._aadad6dfd56d068d2e377606910c006f._comment | 8 + .../polls/prioritizing_special_remotes.mdwn | 16 + ..._dd9280df27848a7ff132f5809dab0a79._comment | 8 + ..._370e0b9c43486ee96c825f9155eebde4._comment | 8 + ..._883a003b9c552b89f191135c582f99aa._comment | 14 + ..._746006c3fffc7f917c4526fd688051f7._comment | 8 + ...ing_me_from_using_git-annex_assistant.mdwn | 16 + ..._10a4839a05be39ced54ffbe880a588bb._comment | 25 + ..._ac91d866f11c66dd8c86e2cd1a368c85._comment | 10 + ..._e244c1bf334b1cc9ad0cc760bf8fe5de._comment | 29 + ..._1a0faf4bdc78741937e8a2f5cb5bbec6._comment | 12 + ..._8d8a11dbfae7a7bc574bdf37f87e0684._comment | 16 + ..._c437adeaccf0b3d134e0f81c64e25b9f._comment | 14 + ..._6e3fce3a32ab346dc3d0fd4b69967536._comment | 8 + ..._1b7233d88593d0d99b26ea3e7af20d9c._comment | 8 + ..._a23d5a0e2718b8e486f036fe8a413b36._comment | 10 + ..._f4c84a9d701d52cf2f2e45f3d764a90c._comment | 18 + ..._00a0de8190d946caaeeca3b44646146f._comment | 16 + ..._199c9807499470771af6cbca6d034cfa._comment | 8 + ..._9185b0e05b1b1997533694da1de83073._comment | 22 + ..._35f6f121e54260cb960211a6e2e51e8e._comment | 14 + ..._acbe4f63b5d552ac5ae5a12c6f42dc18._comment | 25 + ..._0d988280865caae498a3b693b6342e37._comment | 16 + ..._ac8fe3768c30dd7999c183500f8567bb._comment | 19 + ..._36832de705a2bebf8dc6e65dcd661731._comment | 15 + ..._3618067e473577a112e36970ca71e0ab._comment | 12 + ..._07a13b6f000ddc0ac4472b863d8b50bd._comment | 14 + ..._e15eb407d988fda363296c8b566cc8fb._comment | 12 + doc/design/assistant/progressbars.mdwn | 43 + ..._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 | 65 + ..._24399abe0a0c1de271490ee15e064760._comment | 8 + ..._36a811bca209c7ac8a44d64bf8bc5bf3._comment | 8 + doc/design/assistant/syncing.mdwn | 220 + ..._c70156174ff19b503978d623bd2df36f._comment | 19 + ..._eb992b5b2c7a5ce23443e2a6007e5ff9._comment | 8 + ..._e1b5e8a24556de16d1cacd27ee0c1bd1._comment | 80 + doc/design/assistant/syncing/efficiency.mdwn | 77 + doc/design/assistant/telehash.mdwn | 90 + ..._8b08b5c30e5aea3fc4599f856fd25df5._comment | 8 + doc/design/assistant/todo.mdwn | 4 + doc/design/assistant/transfer_control.mdwn | 123 + ..._d5adaef4712913dc0263d4ebafb79320._comment | 15 + ..._3b51474fefa6c0d19055046e06af196d._comment | 14 + ..._44a1a6d2db9097de9ae68ea1ff1b08a2._comment | 8 + doc/design/assistant/upgrading.mdwn | 52 + doc/design/assistant/webapp.mdwn | 65 + ..._bab6f6fa720273c0f9700a3765150189._comment | 8 + ..._3cf0cf460c7869d0cc22940fcc84aec4._comment | 10 + ..._428e153135f7a64215730719207d82c4._comment | 8 + ..._f4068a7abbb77ba6a3297cbcf1e503e9._comment | 10 + doc/design/assistant/windows.mdwn | 33 + ..._f4b829318b182e1cec29f13babb6498e._comment | 10 + doc/design/assistant/xmpp.mdwn | 136 + ..._f20650f93d7f0ca39b9ba3ce0380193f._comment | 10 + ..._8c22839a8f5912b4a817415c4a359697._comment | 8 + ..._773102522f21844cffc841e6cde9229e._comment | 8 + doc/design/assistant/xmpp_security.mdwn | 29 + ..._c714e86553c02600249795efb224be8a._comment | 10 + doc/design/caching_database.mdwn | 124 + doc/design/encryption.mdwn | 126 + ..._4715ffafb3c4a9915bc33f2b26aaa9c1._comment | 12 + ..._a610b3d056a059899178859a3a821ea5._comment | 10 + ..._cca186a9536cd3f6e86994631b14231c._comment | 12 + ..._8f3ba3e504b058791fc6e6f9c38154cf._comment | 10 + ..._520e60aa53217b5ba428d4c05d897dee._comment | 16 + ..._d677fead0fe0c543f48f07d85f83f592._comment | 14 + ..._c1c38a09b1276e29adc3ba564dc0fe4e._comment | 14 + .../external_special_remote_protocol.mdwn | 293 + ..._8d3c35eb0a2a9c57b10566fcaf56d248._comment | 8 + ..._241e57092d9e5631ac0ec4dd962477a6._comment | 12 + ..._e3029c65d34f78272bc11961ebfd8237._comment | 10 + ..._472748f03ba8dad773da7f35b70cb6e4._comment | 15 + ..._71c3e21a72222250bab933e1c9167fbc._comment | 14 + ..._c77386deddc64b2028d9c3a7393d4df7._comment | 10 + ..._5baff75d278394a8818c348fb4f13b8a._comment | 10 + ..._70429b7c4f1e4083a9d5a6e2e238056d._comment | 8 + ..._c763e44d06d9f50f0d357889b180b819._comment | 15 + ..._20ff41d82b5f1872698a5b24adcd0c41._comment | 12 + ..._3ee158e548002badae5bf44dc0442626._comment | 13 + ..._ee2828ce25b83bbabc9d5dde35d1e57b._comment | 12 + ..._edb649d0019a061ef7bf6534a444429d._comment | 16 + ..._1f4c205a5ce6f33ccf2f4d80754e5699._comment | 8 + ..._15c4cfe064be37cc104dcb6aa049a449._comment | 14 + doc/design/gcrypt.mdwn | 8 + doc/design/git-remote-daemon.mdwn | 173 + ..._bfa8f33a3fdb6e271dfbdd0378b5d364._comment | 16 + doc/design/metadata.mdwn | 196 + ..._22ed80bd8eabaa836e9dfc2432531f04._comment | 22 + ..._03ae28acedbe1fa45c366b30b58fcf48._comment | 14 + ..._ee850df7d3fa4c56194f13a6e3890a30._comment | 12 + ..._c32ade1524487e5fdc6f83b2db39f04c._comment | 8 + ..._0ac3132cd7a84f0e170fbe3a6f235fe7._comment | 8 + ..._fa51ae544b193122334dbae7960ab3d9._comment | 15 + doc/design/preferred_content.mdwn | 21 + doc/design/requests_routing.mdwn | 100 + ..._421b14a4dd9d6c431e00333057df1627._comment | 10 + doc/design/requests_routing/simroutes.hs | 402 + 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 + ..._f3cc7a25af4c59fda3924c737a789419._comment | 8 + ..._e47476c80af02a2e9cf76c53fdbb8534._comment | 9 + ..._b57956a8ce372d620f21ea9a497e8013._comment | 8 + ..._812b630df01ac35254e3c4e677554e2b._comment | 8 + ..._a9670eca2aff9ad5f04412a8d8b6df6a._comment | 8 + ..._4f87e2ab119f3cd81266159f02952188._comment | 9 + ..._a865216046aa91a47d0d2b2f0668ea89._comment | 12 + ..._3f7045a00905b4287d950b08d5a77a82._comment | 9 + .../day_100__git-annex_sync_--content.mdwn | 4 + doc/devblog/day_101__old_mistakes.mdwn | 23 + ..._2c6e991efde3296450189b2821f2ccc3._comment | 17 + ..._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 + ..._a693a56123497a39c30cbd35b8e35bce._comment | 10 + ..._9833fb9daa50bc838cc46ca2f6c16580._comment | 10 + ..._873a882ec1ddc3be473473cb224a9040._comment | 12 + ..._5ef1bb4d69cf7206f7ca0e542abad6bd._comment | 13 + ..._1964bfce4887c9c0828fd7f54f5b4f6b._comment | 12 + ..._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 + ...ay_108__new_use_for_location_tracking.mdwn | 20 + .../day_109__elimintating_absNormPath.mdwn | 18 + doc/devblog/day_10__lazy_Sunday.mdwn | 23 + doc/devblog/day_110__release_prep.mdwn | 25 + .../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 + ..._8aa413e75cab411b0aec254f0f33ebb9._comment | 8 + ..._db31d08690730836ce6277e797fcae1d._comment | 8 + ..._d44da76b18f53a5f51b46e3e15090a48._comment | 8 + .../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 + ..._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 + ...y_134-135__avoiding_the_turing_tarpit.mdwn | 18 + doc/devblog/day_136__frustrating_day.mdwn | 10 + ...-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 + ..._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 + ..._311a7245dd12f1a7e432168d16041348._comment | 8 + doc/devblog/day_145__a_plan.mdwn | 16 + ..._c0ceea77443be1172527ed8549f000a4._comment | 10 + ...day_146__halfway_to_git-remote-daemon.mdwn | 17 + .../day_147__git-annex_remotedaemon.mdwn | 5 + doc/devblog/day_148__too_many_documents.mdwn | 8 + .../day_149__remote_control_working.mdwn | 15 + doc/devblog/day_149__signal.mdwn | 16 + ..._14__gcrypt_refinements_and_OOM_fixes.mdwn | 26 + doc/devblog/day_15-17__Android_rebuild.mdwn | 67 + doc/devblog/day_151__birthday_bug.mdwn | 18 + .../day_152__more_ssh_connection_caching.mdwn | 37 + .../day_153__remotedaemon_has_landed.mdwn | 10 + ..._f19ae6b3d6f33a68e4ffe0c32f788745._comment | 13 + ..._fbf0c50f772e958af638d2b72dac73f5._comment | 10 + doc/devblog/day_154__catching_up.mdwn | 13 + doc/devblog/day_155__missing_bits.mdwn | 27 + ..._76424498600ba603946035efffb88023._comment | 8 + doc/devblog/day_156__release_day.mdwn | 14 + doc/devblog/day_157__upgrade_checking.mdwn | 22 + doc/devblog/day_158__enroute_to_Brazil.mdwn | 10 + doc/devblog/day_159__tmp_file_cleanup.mdwn | 12 + doc/devblog/day_160__.mdwn | 20 + doc/devblog/day_161__routing_design.mdwn | 13 + ...g_sim_and_massive_contribution_landed.mdwn | 17 + .../day_163__request_and_routing_design.mdwn | 3 + doc/devblog/day_164__back.mdwn | 17 + doc/devblog/day_165__sshpassword_merged.mdwn | 18 + doc/devblog/day_166__catching_up.mdwn | 40 + ...e_community_of_git-annex_contributors.mdwn | 11 + doc/devblog/day_168__backlog_continued.mdwn | 16 + doc/devblog/day_169-171__juggling.mdwn | 14 + doc/devblog/day_172__.mdwn | 7 + .../day_173-174__android_rebootstrap.mdwn | 8 + doc/devblog/day_175__encoding_day.mdwn | 20 + doc/devblog/day_176__mostly_a_day_off.mdwn | 8 + doc/devblog/day_177__enabling.mdwn | 21 + ..._820d29f84dade09b0e7bb7435c52fcb8._comment | 12 + ...day_178-179__screencast_and_what_next.mdwn | 12 + ..._eeba788fed45cb22f9cc2a738ceaa074._comment | 8 + ..._d44e67e34615c7b00e29f307556cdd06._comment | 8 + doc/devblog/day_180__porting.mdwn | 13 + ..._133875f4435a298b85ddfb8a2cc11a7a._comment | 9 + doc/devblog/day_181__tricky_merge.mdwn | 8 + doc/devblog/day_182__service.mdwn | 6 + .../day_183__rubbing_sticks_together.mdwn | 23 + doc/devblog/day_184__windows_month.mdwn | 22 + doc/devblog/day_185__service.mdwn | 6 + doc/devblog/day_186__cracked_it.mdwn | 8 + ..._288b736adf392acd0f45667b2980138d._comment | 11 + ..._d1d79e93ac420f6b3a6f8a622e8e00bd._comment | 8 + ..._8ca17a51b10b4e4a63d0672d5ce29024._comment | 8 + doc/devblog/day_187__release_prep.mdwn | 10 + ..._206692d16177c2a9ca11c0eeff545697._comment | 13 + ..._961fb35d9cf7d5e518f8d0bddb8626a6._comment | 8 + doc/devblog/day_188__back_sans_laptop.mdwn | 5 + .../day_189__finally_working_again.mdwn | 18 + doc/devblog/day_190__fun_fixes.mdwn | 13 + doc/devblog/day_191__semidistracted.mdwn | 7 + doc/devblog/day_192__release_day.mdwn | 4 + doc/devblog/day_193-194__ugly_bug.mdwn | 37 + doc/devblog/day_195-196__catching_up.mdwn | 13 + .../day_197__autobuilder_rescuscitation.mdwn | 14 + doc/devblog/day_198__branching_out.mdwn | 23 + ..._91ce3dc707ba1ba7c5d9e57e20ffce40._comment | 8 + doc/devblog/day_199__ten_minute_cycle.mdwn | 6 + doc/devblog/day_19__moving_on.mdwn | 37 + ..._870106f671f9a055b81e6fc83e0850b5._comment | 8 + ..._fad055c8860385ac6c012f897c96408f._comment | 10 + ..._69e47d612159587f080ab761566d1830._comment | 18 + .../day_1__inauspicious_beginning.mdwn | 11 + ..._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 + .../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 + ..._0eb247235fbf8f563934f3548e1d2e10._comment | 8 + ..._e8b1dfe1b0641e031d05733448b7bc8b._comment | 8 + ..._b67f8ef4ed42b49c8c2e6c4e53163b16._comment | 18 + ..._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 + ..._93447dbd4eb09b4db96770644ea663cb._comment | 10 + ..._e1d022b25f2c16dbe72db07ad4b10a2d._comment | 8 + doc/devblog/day_30__cronner.mdwn | 17 + ..._53dfd9310e92f5225db52a13e20a46d4._comment | 10 + ..._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 + .../day_35__anacron_and_bugfixing.mdwn | 15 + doc/devblog/day_36__bugfixing.mdwn | 1 + doc/devblog/day_37__long_day.mdwn | 6 + .../day_38__starting_git_repo_repair.mdwn | 11 + ..._321468d9686db5dde072500bdaeb7d29._comment | 10 + .../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 + ..._a716c7b5a9ea3c949ff047cfb4e9a0a4._comment | 8 + ..._33149e424cd5f03fac376288bcc4dfdc._comment | 8 + ..._3b07503bd79089ad3ce3ddd7535ed116._comment | 14 + doc/devblog/day_42__repair_milestone.mdwn | 35 + doc/devblog/day_43__bugfix_day.mdwn | 26 + ..._44__automatic_removable_drive_repair.mdwn | 16 + doc/devblog/day_45__command_line.mdwn | 9 + .../day_46__wrapping_up_the_month.mdwn | 18 + .../day_47__fell_off_the_blogging_wagon.mdwn | 3 + .../day_48__direct_mode_guard_design.mdwn | 29 + ..._ec0147ccc55bad3a38652383f4098a65._comment | 8 + ..._49__direct_mode_guard_implementation.mdwn | 14 + ..._3ebe5c3f708070f164ecaf36b79f7bfc._comment | 8 + .../day_4__unexpected_windows_day.mdwn | 10 + doc/devblog/day_50__grab_bag.mdwn | 34 + ..._01846f6494fe843889391fd09fd127a0._comment | 8 + ..._12736014aa2c1af81e4b83072505e7d5._comment | 8 + .../day_51__direct_mode_guard_finished.mdwn | 6 + doc/devblog/day_52__slowly_but_surely.mdwn | 5 + .../day_54__android_bisection_minions.mdwn | 9 + ..._bea8fbe2b87d4a4865b92fa796298fa0._comment | 8 + doc/devblog/day_55__fireside_porting.mdwn | 22 + ..._d690a52db82f9594d99ae65fe51e1f1a._comment | 8 + .../day_56__git-annex_user_survey.mdwn | 20 + doc/devblog/day_57__mavericks.mdwn | 14 + doc/devblog/day_58__urgle.mdwn | 16 + ..._bd279f58f614b103a53215dfb0211007._comment | 12 + doc/devblog/day_59__release_day.mdwn | 11 + .../day_5__gcrypt_special_remote_part_1.mdwn | 7 + .../day_60__damage_driven_development.mdwn | 36 + ...day_61__damage_driven_development__II.mdwn | 15 + doc/devblog/day_62__upgrade_alerts.mdwn | 22 + ..._cdb44aaa1d2a784a72613cbf16038f89._comment | 8 + ..._b08bb946e4760d7f03b45c852c745b2e._comment | 8 + doc/devblog/day_63__leverage.mdwn | 24 + doc/devblog/day_64__overkill.mdwn | 31 + ..._e1db7678aae37af281d31ae211677786._comment | 10 + ..._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 + ..._136bb7537a9ba93d400ce6f6ea1932ac._comment | 8 + ..._1f8faa65bbd56a12588b43a5bc822d96._comment | 10 + ..._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 + ..._b1aa185734c3d74830b81def4fe63bff._comment | 10 + doc/devblog/day_75__hallelujah.mdwn | 8 + ..._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 + ..._12bb94d903868ecddb3e348c9c4afeaf._comment | 8 + ..._d3e38d6f6bba179dab40d4d75ff061de._comment | 8 + doc/devblog/day_80__plumbing.mdwn | 9 + doc/devblog/day_81__more_standalone.mdwn | 15 + ..._25ceb116406b55a8ff28f7b392806bc9._comment | 10 + doc/devblog/day_82__rpi_and_synology.mdwn | 21 + ..._d154ddcf22027fd06acf9da73e12c006._comment | 8 + doc/devblog/day_83__armel_webapp.mdwn | 19 + doc/devblog/day_84__ho_uh_oh.mdwn | 11 + ...xternal_special_remote_protocol_types.mdwn | 25 + ...xternal_special_remote_implementation.mdwn | 11 + ..._5116bcf4b60030cb46683df94a75d7ee._comment | 8 + ..._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 + .../day_95__reconnection_revisited.mdwn | 13 + ..._c1106e573fcf9f3d4524c0e4f4254790._comment | 8 + ..._40478739f95e0b56ce0103db6e405ef4._comment | 10 + doc/devblog/day_96__catching_up.mdwn | 7 + ...ay_97__exciting_telehash_possiblities.mdwn | 20 + ..._7c775d93cbeed0d553e224751d30fbaa._comment | 10 + doc/devblog/day_98__old_bug.mdwn | 17 + doc/devblog/day_99__catching_up_again.mdwn | 19 + ..._b871bf0606dc29be9b8c2e5dc150f708._comment | 10 + ..._c8363d47223e7bb899420e800bde3e27._comment | 8 + doc/devblog/day_9__Friday_the_13th.mdwn | 21 + ..._07195b4ec399ba1be6c8bdb3ae0fa50b._comment | 12 + doc/devblog/day__126-127__merge_fixes.mdwn | 61 + doc/devblog/moving_blogs.mdwn | 5 + ..._6caa7e67461a6ea5de8155ae9cf75fab._comment | 8 + ..._e3e2048fc2397b87a2f29c9fe49394cb._comment | 10 + doc/devblog/whither_XMPP.mdwn | 30 + doc/direct_mode.mdwn | 93 + ..._1c79c93f4b17cfc354ab920e3775cc60._comment | 26 + ..._1b5218fdb6ee362d6df68ff1229590d4._comment | 10 + ..._7d507b6f87085a19d8dd5014f580922b._comment | 24 + ..._5169c5541970d3b3bc1e080e07539b22._comment | 8 + ..._55108ac736ea450df89332ba5de4a208._comment | 12 + ..._03a02e689d92faa596de98e02b2ffe28._comment | 10 + ..._ff4ffc2aabc5fd174d7386ef13860f78._comment | 10 + ..._1cd32456630b25d5aaa6d2763e6eb384._comment | 8 + ..._8020d74bddf0e38b0a297e5dae7c217b._comment | 12 + ..._97c26bd82f623a3b2d56bab4afff0126._comment | 12 + ..._42363bf0367f935b3eee8ad3d2eaf5cf._comment | 10 + ..._5f03b1686c1fb3f7606a5bc724ac3812._comment | 8 + ..._5355ac418bfb26e990762b80f4c36b77._comment | 12 + ..._6cd15e2c5fd0bef48f60c6993322c2fc._comment | 9 + doc/distributed_version_control.mdwn | 21 + doc/download.mdwn | 40 + ..._ec2578241a966cfcdd43f2a26a5c8709._comment | 13 + ..._ee0d158ac59903737dbc4ef632f11fe3._comment | 7 + doc/ekg.mdwn | 31 + doc/ekg/ekg.png | Bin 0 -> 57392 bytes doc/encryption.mdwn | 101 + ..._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 + ...d_server_for_syncing_-_possible__63__.mdwn | 3 + ..._924521ad5972046bac44d2e04ec296c7._comment | 10 + ..._e2a7f34a3ccc1b6467e6da611c067d66._comment | 8 + ..._f9a369a6ac69f091e6128990274d3228._comment | 10 + ..._91b422f8d55b68077245c606c4f7f87c._comment | 28 + ..._f6128fe75ff3453747f69f12e0fd0a5b._comment | 12 + ..._9b90b4031a5ed26c375903b33ed65a10._comment | 17 + ..._acd64ce1b08a97ddf730622272e9f611._comment | 14 + ..._9baacb14fc5eb449cb13e0b4a4995fb0._comment | 8 + ...s_to_delete__44___files_to_keep__63__.mdwn | 12 + ..._fe291cd6cd8e2d5b8e23f8e3689d824b._comment | 15 + ..._f0dbc3c723999bf0f22502e3a89d1d4a._comment | 8 + doc/forum/A_really_stupid_question.mdwn | 3 + ..._40e02556de0b00b94f245a0196b5a89f._comment | 31 + doc/forum/A_tiny_filesystem__63__.mdwn | 7 + ..._993e3f5dbe4bcbb5b7bd9e08ab9554f3._comment | 8 + ..._af57591d42868c8aa1cc1eda43ca8b98._comment | 8 + ..._3869c0472b50d7cf5e29ac0720f4f20f._comment | 10 + ...ssing_files_directly_on__a_USB_device.mdwn | 11 + .../Accessing_files_in_bare_repository.mdwn | 5 + ..._7eb66e3806f9524e043fae2da9d57d64._comment | 10 + ..._f0165d66865ad14f7eb5d50e900c1df4._comment | 10 + ..._0e7ea5161b6da6e9bb9425bdb953de33._comment | 8 + ..._f804b9bf71f7d04bd23ce32d813dc340._comment | 8 + ..._6de649d38febd2240eb5b703da77c2d6._comment | 15 + ..._7e8dd09915ddc3267377e900891cb02c._comment | 24 + ..._80eae4a73f38d1a7e35f97c33b6401f8._comment | 8 + ..._5ec13e98d3ecb69426e974d34f712f9b._comment | 8 + ..._dccbf5793998c6381e23eb8ff6497ebf._comment | 17 + ..._42d923916232c81f3b8bdbefa34a89d3._comment | 18 + ..._43a0a7d222faee582aeb3150a59cef87._comment | 8 + ..._ec1024235c1c74c113483a833df84654._comment | 12 + ..._c156b8c1ae0f2905566bbdb13b84e577._comment | 37 + ...__and_crippled__41___annex_repository.mdwn | 28 + ...ect_mode_sync_should_avoid_git_commit.mdwn | 1 + ..._06dae5709750ea1da4f7fdbee4e84efc._comment | 16 + ..._2069c5c41882ae0a1973fb7da583b60e._comment | 10 + ..._b35e3a87c30974eedd71ebe52ecbed96._comment | 8 + ..._84e026f9bda87bfd12a3769dcef77f8b._comment | 8 + ..._b2ac2ea300a5026832b40a1a6b27a7cd._comment | 8 + ..._ed3534196164c6736a8dbf21c65c119d._comment | 10 + ..._1e29bcf568f02765c48f0eac6c640673._comment | 45 + ..._9ea6803a94b1de15079a3fa20d59c9af._comment | 10 + ..._3fae5a7fa5d99d0eb4473adb43e7f6f5._comment | 8 + ..._57a5b73cff480266355e75c7bdc762c2._comment | 8 + ..._bbcf5e863c8f152e1079536e9011a404._comment | 16 + ..._fdcd144c22601bdf98ff844254b0120d._comment | 8 + ..._b77243e765b2af7ba71e963fcb5cbbb1._comment | 71 + ..._cb0815e96ee211d4778f2e7a4274e855._comment | 8 + doc/forum/Add_a___34__local__34___remote.mdwn | 13 + ..._c68ad724b465c4be5243be687168c0b3._comment | 12 + ...dding_existing_S3_bucket_to_sync_with.mdwn | 16 + ..._30b9a70d367dd5b8781e9a86e42d4c3e._comment | 10 + ..._a8525c1a7e5f89c30c9503fe8bfed02e._comment | 8 + ..._c3878989f74e740c0ed42f440750f3a4._comment | 8 + ..._c06cc86496f9d4c0c42a8c89aa5a7b35._comment | 8 + ..._0a1c2dd0929511ff824be8de2c8d85eb._comment | 9 + ..._1444c2f89885f028f20a4d3ce225a403._comment | 23 + ..._1c30944010d541096baff18198a5560d._comment | 23 + ...eded:_git-annex_slows_down_my_macbook.mdwn | 21 + ..._af8ab0a47cd379fcb1445e50782ad086._comment | 12 + ..._a7202bcbdda36a3801833d2432db1965._comment | 25 + .../Android:_Encrypted_Remotes__63__.mdwn | 3 + ..._6b16cd372a9bd4f99d4c8b09a82ce3ed._comment | 10 + ...t_high_cpu_usage_to_be_expected__63__.mdwn | 3 + ..._7880fc38792a1fcbf3e5c47e8bcaabce._comment | 8 + ..._840fbce18b4fdec21ee557fdf52c366e._comment | 10 + doc/forum/Android_-_ext3__47__4__47__....mdwn | 1 + doc/forum/Android_version_does_not_sync.mdwn | 23 + ..._ed9e33eef2c6d651847dca9d3f7a63f6._comment | 8 + ..._4eafd3e989611f835c489b379bd6ec8a._comment | 8 + ...Annex_contents_just_disappeared__63__.mdwn | 12 + ..._4ab5ca00f912c0c95fabc10f2d9600d3._comment | 12 + ..._657f737c5d64d440aa133ddb41408fbc._comment | 8 + ..._9b4c35feb14b37d43d053d7430da9abf._comment | 12 + ..._c3625409652bff5f2165260803269a8a._comment | 10 + doc/forum/Annex_dropping_files.mdwn | 12 + ..._62fbea95248fda2ff075b5a8952a728f._comment | 8 + ...nnex_slow_on_Windows__47__direct_mode.mdwn | 11 + ..._d80839f4582fc2a6269db31e30e1dbab._comment | 9 + ..._593e1e01b70a2b6a15ad6bca09a80c7b._comment | 8 + ..._c4e4c596f31aa97645fe1e1527dc2c31._comment | 12 + ..._92db0b99ada9af15a5383da41397ebd7._comment | 19 + ..._3d628c9db9ebdfd5bff92af105c47719._comment | 13 + ..._db7965fa928c093233769ed52b2fcd43._comment | 10 + ..._674f52c5e5484207db403b18efc986c6._comment | 8 + ...d___34__.git__34___to_git-annex__63__.mdwn | 9 + ..._51f4392e718d857e2f155d6217727a53._comment | 10 + ..._9698c4a8f0d8785ee89a6228e0e85ca9._comment | 8 + doc/forum/Assistant:_configure_auto-sync.mdwn | 11 + ..._c8cabd38114582bbdbad49f2d81959d7._comment | 13 + doc/forum/Assistant_Droping_Files.mdwn | 8 + .../Assistant_loosing_advantages__63__.mdwn | 10 + ..._cdbc827d9e00aeeaefafe45de64b8d2c._comment | 10 + doc/forum/Assistant_not_syncing_to_Rsync.mdwn | 15 + ..._2178a7fc0d66643e84597b0938ef65f2._comment | 10 + ..._650651398443e128c2adc6a2a2d320d0._comment | 12 + ..._e6d0c9620b148acc72342862a8b4cfef._comment | 10 + ..._b91f9febdb8b69d8b487ba4ea08c119a._comment | 11 + ..._c5ad7c1546a17d8459c995c9c8c26414._comment | 31 + ..._4c12587f972eced91c5128d4885800b5._comment | 30 + ..._6ecaaee9316bcf0c65688676d60fc055._comment | 8 + ..._daa9a9a6188afa0394833e1b682f7cd4._comment | 10 + doc/forum/Auto_archiving.mdwn | 17 + doc/forum/Auto_sync_with_music_player.mdwn | 1 + ..._81ad1c15cfd753531c01dae8945d1caf._comment | 8 + ..._a15e3f298c3d3faa5b3295355f9bb794._comment | 11 + ..._99f65a0efaf5d5f9b8ff530acc122860._comment | 8 + ...es_due_to_external_modification__63__.mdwn | 46 + ..._dab1099ee56541c194de319c593f1268._comment | 9 + ..._b5faccf132fb47e3cda778a6600fd9ef._comment | 8 + ...ic_commit_messages_for_git_annex_sync.mdwn | 1 + ..._ea2ec57bc695da4df8a30a35d433959d._comment | 15 + ..._af71f53dbbca35d5a5c66ff131887ada._comment | 8 + doc/forum/Automatically_dropping_files.mdwn | 7 + ..._f5fc608f9cb0edf3272b586b62050637._comment | 12 + ...lly_syncronise_centralised_repository.mdwn | 14 + ..._6a2047daa9faf4309d2ed27d5cc48b76._comment | 10 + ..._3be7b45bc2284019f17a81375637a576._comment | 10 + doc/forum/Basic_set_up_with_one_remote.mdwn | 14 + ..._3ad06a0dbebf62e6440f549e77af59b6._comment | 15 + ..._59e18e759c907b8adabf8c34eef08065._comment | 10 + ..._5221a713ee3f65fa2740c9fa6cb1db0f._comment | 27 + ..._62e554a546e4b50d211f5f65446fd289._comment | 13 + doc/forum/Behaviour_of_fsck.mdwn | 13 + ..._0e40f158b3f4ccdcaab1408d858b68b8._comment | 8 + ..._ead36a23c3e6efa1c41e4555f93e014e._comment | 19 + ..._97848f9a3db89c0427cfb671ba13300e._comment | 19 + ..._e4911dc6793f98fb81151daacbe49968._comment | 8 + ...or_central_sharing_and_multiple_users.mdwn | 8 + ..._48ffb50b92588daec6887bf08f1b97f5._comment | 10 + ..._6b9a20f9707da9d2cfc3697a538d6935._comment | 12 + ...manage_files_on_removable_media__63__.mdwn | 18 + ..._direct_and_crippled_annex_repository.mdwn | 17 + ..._552e74f9573a34ec178f396b83252c3e._comment | 12 + ..._33c57922714f204fc63c260b838f3712._comment | 8 + .../Big_repository_vs._multiple_small.mdwn | 8 + ..._8e21ee3c674ef6e595bdab53dd5c2356._comment | 8 + ..._656c62351502492d20e8490242e51169._comment | 14 + ..._e9c44ea364513f090844f46af2ea46a1._comment | 8 + ..._82e13580426dc648688e4c26e7ed91ec._comment | 8 + ..._632aceb71dc6a4a9a4bb03de25a9b21a._comment | 23 + ...sn__39__t_been_working_for_a_few_days.mdwn | 72 + ..._6ca872c241399b9129cf9a18f42ebd43._comment | 8 + ...uilding_a_Debian_package_of_git-annex.mdwn | 27 + ..._0848513c46f3efa21bc34784554ae88a._comment | 10 + .../Building_git-annex-3.20121112-19309.mdwn | 78 + ..._b115e28c77fe748ee6643c41f766beb4._comment | 12 + ..._8c6ae1fd74f14da12ccfa77dbd27fc65._comment | 16 + ..._2f30b301c14f3a7fa0f52715d6140353._comment | 13 + ..._1e3c3903a71a2ff7109372aa4dd5742a._comment | 8 + ...esolve_dependencies___40__yesod__41__.mdwn | 19 + ..._2eb4f410b54a25fcc895893a3c631c43._comment | 8 + ..._44cd6f6dd674df105d6f0b3f320f3236._comment | 19 + ..._992af6855901df79a2018a07941cb8b6._comment | 8 + .../Calculating_Annex_Cost_by_Ping_Times.mdwn | 1 + ..._9b4a6bc8d52ecbbdd537e8cf76757a80._comment | 15 + ..._7e04f85c6ba74c18c8dde148aef9bf80._comment | 8 + ...in_the_git-annex_git_repository__63__.mdwn | 6 + ..._c8f9923d8dc76b8bed25dce5ae09b520._comment | 8 + doc/forum/Can_Not_Sync_to_Git_Repo.mdwn | 1 + ..._e0f82074eb1a4b8258729d9a23a7f421._comment | 33 + ..._842aaf685aa843c21bf3eef0b61f8630._comment | 8 + ..._b4f8be428a08db01dbd004e1f06dcffd._comment | 10 + ..._80344c54804ddee81d89c0b40731fb9c._comment | 8 + ..._1797c2fef5c20e885b56b8a2c6330ff0._comment | 8 + ..._fb23d640f9634cab2da91848f1848627._comment | 58 + ..._a947736911e68856f2c3494963063df8._comment | 8 + ..._ce0e77143cfd2d578b1e5a71e35060da._comment | 18 + ..._10e114da6a2bb54b860b44767ba1ca94._comment | 17 + ..._415bab6a7ab564e671f42cfad83e0e58._comment | 10 + ..._36abd829ea71a44c7cded1123a7c913d._comment | 8 + ..._2fb745aaffe544f97bbdc670261fd4fd._comment | 14 + ...git-annex_merge_to_work_from_git_hook.mdwn | 41 + ..._8b71cb6772b219c27c17392d5099907a._comment | 12 + ..._af2a2634d8d128868022d033d6adb549._comment | 13 + ..._31ec762a0684d2ce87d229ed2924db93._comment | 16 + doc/forum/Can__39__t_get_jabber_working.mdwn | 7 + ..._def20bf0b3c1a188e4dad5ec67b455d8._comment | 8 + ..._7cb49c0ebfec6e0fe6784e189ed65d40._comment | 8 + ..._852dc402a286e38b77b99f174c33f8d1._comment | 8 + ..._259741e146906ff70540390bdfe07002._comment | 8 + doc/forum/Can__39__t_get_pairing_to_work.mdwn | 5 + ..._b981977b4fb942fd109c37fcf40f35d7._comment | 22 + ..._341e2ff6c88ace1b1422e16781edf580._comment | 8 + ..._0c8cce48f179f2564ff0844bb7ef6bd1._comment | 8 + ..._169d77b30cea05125068ee1eeb2ef328._comment | 25 + ..._70e6c4f4f01277be1767b38ca8374793._comment | 11 + ..._2cd014a76fac6e08269dfd8146957418._comment | 10 + ..._b9b715084d5a5562998b1724699d49e5._comment | 8 + doc/forum/Can__39__t_init_git_annex.mdwn | 15 + ..._c4d2ab1ecf69718a2211c3ea7b27092b._comment | 10 + ..._fca9ed3707e097bee2cd642424681005._comment | 8 + ..._a294b5e7e52aa9f66a708866be16f137._comment | 10 + ..._fcf678d5188821d63b4c9ea5b59474a8._comment | 13 + ..._c83f7dea7d5304e226e52eb3c43ef14a._comment | 9 + ..._06a01dd51ffbfd006c0afb8eab40b530._comment | 8 + ..._53c33484bded57abc60f0449331c7b05._comment | 11 + ..._9e0ff44f6e62581bfc83f9f1da3e0100._comment | 14 + ..._7f96b5ef05e2faf4a3dbe8bfc39b810e._comment | 10 + ..._65ab8463716f4ddd7721a5bcfcd18fa0._comment | 8 + ..._31a45f6a72266190b3ed7a7b02e03d5b._comment | 8 + .../Can__39__t_install:_Mac_OS_10.8.2.mdwn | 36 + ..._c44023d81e9e4f7c9341af0e4271a1e4._comment | 10 + ..._dfbcd39eedff28dc9ed866a8f1411ef3._comment | 30 + ..._b37b2a9906ffb956cca91adb4bb4e521._comment | 8 + ..._afddf16f8faedc78d458835480f10dc3._comment | 15 + ..._or_Dropbox...__41___substitute__63__.mdwn | 76 + ..._a3fbae205c0312436f8861f432643811._comment | 10 + ..._de49cf261c644a6e7f6ac881a48d4e6c._comment | 10 + doc/forum/Can_not_delete_Repository.mdwn | 3 + ..._b1a9420974e2e50c9c86a379ad62502c._comment | 12 + doc/forum/Can_not_drop_unused_file.mdwn | 14 + ..._cea83dfdf4cdb4f6efb3f2b33a39a51f._comment | 16 + ..._ed1543cff5e6e81ca18c43b716ca8199._comment | 42 + ..._0c9c9c0ed557af4845a67434c21bb4bc._comment | 10 + ...motes_that_aren__39__t_tracked__63___.mdwn | 13 + ..._35e5a963b9e58ed7773dfcb884f8ecbd._comment | 10 + ..._7cde9785886c8450e1475f0b54481ae3._comment | 10 + .../Cannot_find_git-annex_in_server.mdwn | 10 + ..._bf7e98e6130698ad0dc92e3a6a63ade3._comment | 15 + ..._168dda4aed09f90a510bc453e8a7cda7._comment | 10 + ...unch_webapp_on_ubuntu_12.04_using_ppa.mdwn | 6 + ..._9345551f5772c3a6f1490b00e1edbf69._comment | 8 + ..._0b688a442b6a911a0353e73097a24cb6._comment | 12 + ..._7e246caa00005560bb489c927c663046._comment | 12 + ..._1d8025aabe8bc72711a77f691f67da5f._comment | 8 + ..._7c2f95da65190016192424e7c622122f._comment | 8 + ..._9b8465cefe609e7a696e7573b8892e38._comment | 8 + ..._af6472762a598a454ba52ac0caa059aa._comment | 10 + .../Centralized_repository_with_webapp.mdwn | 13 + ..._dcb9b07fd154f4d4fdef4809cc37ce77._comment | 18 + ..._08c84f2703f89dc12982eba9dd2a06d1._comment | 11 + doc/forum/Change_remote_server_address.mdwn | 6 + ..._401c3d2530ac7ba41dd3857ab4737ed5._comment | 10 + .../Check_if_remote_is_using_GPG__63__.mdwn | 1 + ..._db8ce8ef50fc33a28860ee475988450f._comment | 14 + ..._11c7033904c9c7a1df766e915632c386._comment | 8 + ..._a7ab70ad87a334c36761ddb3d830d99b._comment | 8 + .../Check_when_your_last_fsck_was__63__.mdwn | 4 + ..._ee98a1fcd796fe4fd7af6f77d0c1837d._comment | 10 + ..._in_S3___40__reduced_redundancy__41__.mdwn | 5 + ..._793b3d9f78562f3aecf27dd926bbcf82._comment | 8 + ...ut_only_some_files_with_the_assistant.mdwn | 14 + ..._23d8ab1a05e3e9d3611bd12a4ba70b0c._comment | 10 + ..._bf095ff5b5af95b062ae1f7da566a279._comment | 12 + ..._7c026e36e1cdd52053c34638c87d793c._comment | 10 + ..._up_after_aborted_sync_in_direct_mode.mdwn | 19 + ..._3440b2e1662d3b113c18283afcbf4520._comment | 8 + ..._9a61ba8ac4a375f1d69cd09b5a6f8091._comment | 14 + ..._6b9d8c48547f3d0a911310622ba91df7._comment | 13 + doc/forum/Coming_from_git_world.mdwn | 9 + ..._098bef38c2688607e869425a557cc482._comment | 8 + ..._98d75a1415e0c3689ab4231855e61233._comment | 12 + ..._5e7079e9bf3e4d97191333c66ac00e52._comment | 10 + ..._357443dc601ae38784c01cf18552f4d5._comment | 14 + ..._ed1847dd3f47a9d013b8dd0455fb80ff._comment | 8 + ..._09c6bb83a73d34dff2b8bc185a14a1db._comment | 18 + ..._6c731bb9a8d21dd9ab8c09612b23f908._comment | 16 + ..._e719d99af5afd90da3d3db692eff28dc._comment | 11 + ..._85a42106944dba9995fb3f4bfee3443a._comment | 10 + ..._90623294b910ceca3dc8ebd41b50fc9b._comment | 38 + ..._28dbee30eb54877418f72eb8935302d8._comment | 8 + ..._6edb36ea9535030fa3766937398e5bc7._comment | 8 + ...arison_with_other_big_files_solutions.mdwn | 11 + ...tes___40__specifically_S3__41____63__.mdwn | 1 + ..._9c6c4ca0c9dc6976ba7cf27e84683bf0._comment | 8 + doc/forum/Consistency_Check_for_S3.mdwn | 1 + ..._40385806ef1cc082232cd2723a24be1a._comment | 8 + ..._ebfe40d9f777c9c0a83c44afd0f5802d._comment | 8 + ..._ec9de6882a0eef4d2786e55b583ad020._comment | 10 + .../Controlling_content_on_mobile_device.mdwn | 46 + ..._708649b7f30d8619d7b34dcb0ef46515._comment | 12 + ..._dba1a1b0917332a1dee387b1183bd2cb._comment | 8 + ...egular_git-annex_repo_to_a_rsync_repo.mdwn | 1 + ..._e6065f9c44c85030c7628e2cfa0fd0fa._comment | 12 + ..._76bfb11396dc20a5105376b22e7e773b._comment | 10 + ..._b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment | 16 + ..._8f5e323b29745591f9f2f0f867353f69._comment | 8 + ..._9824c953694770afa0611ff7276737bf._comment | 12 + ..._5899741cb7f83e1b22c5ee3509c5ff21._comment | 8 + .../Corrupt_Repository_Invalid_Object.mdwn | 10 + ..._b7fd4b6212b50400342931e70684b96c._comment | 14 + doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn | 3 + ..._dc14a40b64b7eda94d1a3fd766cd39cc._comment | 28 + ..._608a30e274e6a691a39f69503720e320._comment | 10 + ..._791b9978b410c1aff7fd8ef05c38f5f9._comment | 40 + ..._8665c95299916138c4af375626d9ec7d._comment | 8 + ..._NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn | 41 + .../DS__95__Store_files_are_not_added.mdwn | 3 + ..._30687306da9bd35ec02a806193c5e240._comment | 7 + doc/forum/Debugging_Git_Annex.mdwn | 4 + ..._ce63b2ee641a2338f1ad5ded9e6f09a8._comment | 7 + ..._1d70ff052d00f33c34fd45730ea13040._comment | 12 + doc/forum/Default_text__47__html_handler.mdwn | 2 + ..._4730061916c7e12b7a41906152f847ee._comment | 12 + .../Delete_unused_files__47__metadata.mdwn | 7 + ..._3efc19895c8dec89b71ae3778b583fea._comment | 11 + ..._23597d9468347b3d94257f3c02afe1b8._comment | 8 + doc/forum/Detached_git_work_tree__63__.mdwn | 11 + ..._656c737772bf92be2c7a2f33bd2bb0f0._comment | 10 + ..._28ac35a325fba250721d9f1b7c994960._comment | 8 + ..._7128c26bbc8efea04a5a317edf0ca9f2._comment | 13 + ..._a3c22f905748ff2c803e8621c74a87a0._comment | 8 + ..._8063921241760458349e7cb0cadf3d4e._comment | 8 + ..._4510a787255cb03e7d0c3e7b830b7d52._comment | 16 + ..._ffd9c67ecc5b46ae98996018573f5591._comment | 10 + ..._36ca007643c983604fc4aed6ec8cb3d2._comment | 8 + ..._b7a2da4fbace7156e11c48a496a19dc9._comment | 8 + ..._f9fa237a693d28178f0451799209f7e2._comment | 8 + ...between_copy__44___move_and_get__63__.mdwn | 24 + ..._26ee8192af3a62178c1ccf17c6da5ca5._comment | 10 + ...pointing_to_same_special_remote__63__.mdwn | 6 + ..._359f46805e6508d03aadd90429937546._comment | 10 + doc/forum/Direct_special_remotes.mdwn | 26 + ..._50357130a1c57ad2fab70f71925faf02._comment | 8 + ..._e94a722ca056a068bcc16eb822008602._comment | 18 + ..._187036bbfee0508e2914afb51ead3c71._comment | 16 + ..._6bfbf60f2061d49b7d34c844e7e1dea2._comment | 66 + ..._69c34c655e4b153dfc0d1b8580091124._comment | 8 + ..._b054cfc3d3f81873f3faae7eb4f5337c._comment | 8 + ..._5f9d8a0ef2f13f242594848825d29ee7._comment | 8 + .../Distributing_data_to_a_set_of_drives.mdwn | 1 + ..._f1fa72879f4e1db13bf59dea33c91624._comment | 8 + ..._e13b4e5c1e6f1f503f93d521b504d5c1._comment | 16 + ..._work_when_the_buddy_is_offline__63__.mdwn | 1 + ..._f290dd8547176793934f8077374e1c0a._comment | 17 + ..._c358eb51047f333e582bd824be5e0e65._comment | 8 + ..._a2332c0e7b29110b9aed2ab69ce9d8c4._comment | 12 + ...oes_git-annex_version_big_files__63__.mdwn | 5 + ..._0b44003c1dc53adb807298ae452f8004._comment | 8 + ..._ca40b67abd7bd36155d16d0396d7472c._comment | 14 + ..._32de3501feedce51b43ed9dcc399c7a9._comment | 15 + ..._8c65a7f8bda3c876971c2801fb6a76a1._comment | 8 + ...s_migrate_ensure_data_integrity__63__.mdwn | 7 + ..._cef50b32c46f4406c6f918c5866ddc15._comment | 11 + ..._f389b924c8531b35fdf5dedd10fc8000._comment | 8 + ...tand_how_to_delete__47__recover_files.mdwn | 25 + ..._b307bfb0b70d649897f411eb753bd50a._comment | 14 + ..._58a6a1476274b8c4feb3d43ecd998759._comment | 41 + ..._4b857f481db7b2437ac9f8137a8510e2._comment | 11 + ..._828db3bf2863d98c0b0fb4074aa7f066._comment | 33 + ..._cb2063d6a4e08a5c12bf3723d0fa74e0._comment | 8 + ..._1759bcd5708f591f91b9c410f6dc5c54._comment | 14 + ..._2a389f01eb5131042ea1e71a73c9787a._comment | 21 + ...39__t_understand_local_vs._known_keys.mdwn | 19 + ..._10749c0d76e824217dd1ff8c8a6e42a5._comment | 10 + ..._db9f1b6d9638c2b0a7e241c2727e8cfb._comment | 13 + doc/forum/Drop_with_assistant.mdwn | 5 + ..._048f5a31c549afb19b76a65bddd0cd24._comment | 13 + ..._527d7b6a8efa85b904111f179912d926._comment | 8 + ..._c50857506869bb1cd306b66acf37fba8._comment | 14 + ..._1ea37445d5eb96c3efa182e88e07b867._comment | 8 + ..._c08908ea5232cbe067c73ecd12d0e218._comment | 10 + ..._015134228cb865f97326fbb7193636ea._comment | 8 + ..._950759930667588f21659cd6d7065fbb._comment | 17 + ..._773e540e46adc43487323e8d38ceb2d9._comment | 23 + ..._d85d120d7219ea6c179c2619a17bdae9._comment | 15 + .../Effectively_replicating_backup_files.mdwn | 25 + ..._b1ab0da82db076c5244b0dcc95282ddd._comment | 14 + ..._472ab9c973b475f7f3ce7e3934f94281._comment | 19 + ..._826493bd59b81786c1f6a56f1c438004._comment | 10 + .../Encrypted_Content_Remote_Daemon_.mdwn | 1 + ..._96f63e509e23c081c48302274e21db78._comment | 10 + ..._acd0ffdc3f5079265858073c2af81557._comment | 8 + ...ypted_ssh_remote__44___synced_folders.mdwn | 87 + ..._7b9b4ef614c90e0b222d24678d1b9026._comment | 10 + .../Error_adding_ssh_remote_in_assistant.mdwn | 15 + ..._eecc0660db4083cc91c5330587f74610._comment | 8 + ..._3e6aad22e8020b12ff7ef914b75281d1._comment | 8 + ..._3ea529e16502071fc0980c6d5c60a036._comment | 8 + ...it-annex_branch_but_not_master_branch.mdwn | 1 + ..._9a909e3d89061adacbd8ed370520250c._comment | 9 + ..._0dd489b264374b7b1065b89e1ff7561b._comment | 8 + doc/forum/Fast_cloning_a_repo_initially.mdwn | 3 + ..._0db0caafe30dd1b6f15fb1679dec8f9f._comment | 10 + ..._e17abc209c2b3ba20158be76801ce04a._comment | 8 + ...Request:_add_filename_to_hash_objects.mdwn | 6 + ..._73dc0a9cad486cf2d34faf064c6193b1._comment | 10 + ..._f818b3ecfeb1d1dd83df4668c061718a._comment | 8 + ...equest:_Multiple_concurrent_transfers.mdwn | 19 + ...nnex_copy_--auto_does_the_right_thing.mdwn | 5 + ..._bbac7d0810a79eb1f42a01e1b31d5c4c._comment | 12 + ...pp_support_for_centralized_bare_repos.mdwn | 1 + ...that_lack_a_certain_field_in_metadata.mdwn | 5 + ..._476e52563ccd3ad1b43e3a2da4dfaa82._comment | 10 + ...t_at_an_OSX_launcher___40__.app__41__.mdwn | 3 + ..._97c261b9080c5ecc5424683066bbe05b._comment | 14 + ..._ae45f9703b635c235409682cf252d36c._comment | 8 + ..._066ca31a2e5dfe55a58092ba85231c7c._comment | 10 + ..._a0a9f7f44cadb8036fcddfc21bb0781f._comment | 10 + ..._92240b3f8629f1f2bbe1829700082a79._comment | 10 + doc/forum/Fixing_up_corrupt_annexes.mdwn | 10 + ..._cea21f96bcfb56aaab7ea03c1c804d2d._comment | 7 + ..._5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment | 8 + ...ve_disrupted_the_file_structure__63__.mdwn | 20 + ...e_repo_to_contain_a_copy_of_all_files.mdwn | 1 + ..._702b1b94c735f1b9cde16daa77a80c12._comment | 8 + ..._3df7fcbcd482bb9377ead238b314995b._comment | 8 + doc/forum/GPG_passphrase_handling.mdwn | 76 + ..._11ba130e8bea6698858d0a1a5b01830f._comment | 15 + ..._ef9d58d15b7bbe0b3c7140bb01d73a31._comment | 15 + ..._84eb129c8483b87b3ae6ecaf8b4a8309._comment | 12 + ..._8724297f6d7ac140ab395a940bab0d7d._comment | 8 + ...rating_a_Temp_View_of_Available_Files.mdwn | 1 + doc/forum/Getting_started_with_Amazon_S3.mdwn | 28 + ..._f50883133d5d4903cc95c0dcaa52d052._comment | 10 + ..._e90aa3259d9a12cd67daa27d42d69ab5._comment | 8 + ..._c3adce7c0f29e71ed9dd07103ede2c1a._comment | 8 + ...atus_of_a_remotely_changed_annex_file.mdwn | 75 + ..._e323c21d27bb0946993ba1438429c457._comment | 14 + doc/forum/Git-Annex_with_Asustor_NAS.mdwn | 4 + ..._44445200e5b716caeec225972a5d5dce._comment | 10 + ...le__40__s__41___location__40__s__41__.mdwn | 6 + ..._5baffd4d6994bbcb23614b17777a0ffe._comment | 10 + .../GitBlit_as_a_centralized_repository.mdwn | 2 + ..._06bedf5fbac45415e0cc81f41b25a5a0._comment | 8 + ..._Assistant:_How_to_add_a_remote__63__.mdwn | 11 + ..._d0a3d0090928790d5a05e9f8e5f05320._comment | 12 + ...39__t_backup_files_to_removable_drive.mdwn | 3 + ..._a1d1ae9488924b08682b355aff51130d._comment | 17 + ..._6649077583bc14730a08aaaca7ccb62e._comment | 8 + ..._f359d9b9356de7ee10b9e725a011cc43._comment | 8 + doc/forum/Git_Annex_Sync_Delinks_Files.mdwn | 11 + ..._8b03707777a9d8e38715cb77d2a0addc._comment | 12 + ..._a625e7d88e321532ace103548b31b67b._comment | 18 + ..._5278164dab570755ed58afe466dfad42._comment | 12 + ..._e43ede0bdc20de9aa10ab6ce387d8582._comment | 92 + ..._dc71987f0e19f04a920561201f9552b4._comment | 15 + ..._257a89f81858659c4dac4d116e7cf0a3._comment | 32 + doc/forum/Git_Annex_Transfer_Protocols.mdwn | 9 + ..._a870ec991078c95a6bb683d6962ab56e._comment | 8 + ..._71419376ef50a679ea8f0f9e16991c17._comment | 8 + ..._fea43664a500111ca99f4043e0dadb14._comment | 8 + ..._56fb2dab1d4030c9820be32b495afdf0._comment | 8 + ..._a6ec9c5a4a3c0bac1df87f1df9be140b._comment | 8 + ..._1678452fb7114aeabcf0cc3d5f6c69b0._comment | 8 + ...t_annex___39__corrupting__39___itself.mdwn | 34 + ..._bcf50a215e2f8771e098aadfff4c300c._comment | 43 + ..._75f957e7be6c1ad8936c0a2a5374db3e._comment | 20 + ..._ab062b1df3b55fd49852a6220c98249e._comment | 10 + ..._45974f60a81ed2d00b87ffb1a7963c6f._comment | 8 + .../Git_annex_assistant_in_command_line.mdwn | 2 + ..._ce05226307ade8db90ada2dbf290bd58._comment | 10 + doc/forum/Git_annex_assistant_on_EC2.mdwn | 5 + ..._bbdb4611373117a2176c225378110a05._comment | 8 + ..._614ed11f7134137d6376d36a61c293f5._comment | 8 + doc/forum/Git_annex_on_Windows.mdwn | 11 + ..._da24ba0219a164f9ab93fe75dd85127e._comment | 11 + ..._c0880ce3ee13d388ab5b46a740170845._comment | 50 + ..._70c22716fde60d14fd0c7e74acf4a224._comment | 11 + ..._b9232deab6bc5036d7339aa202013218._comment | 12 + ..._27af3c431b50b540d2bd1d3af3f21080._comment | 8 + ..._79fb5ec1b47593ab3355543c5499284a._comment | 8 + ..._75d4450b4608ad0b453bc69159e708de._comment | 10 + ..._e4e5ad0cda34bb597fe1bb804acc15e9._comment | 10 + ...ex_syncing_speed__44___possible__63__.mdwn | 21 + ..._8aa224b3016dc38e4cea8ee1865a3ab6._comment | 12 + doc/forum/Git_repos_in_git_annex__63__.mdwn | 7 + ..._8aaa0d83e8fcd5997f6b0097f3b21622._comment | 14 + ..._8546341a561a5f55216c2f437f8ec0c2._comment | 32 + .../Git_repositories_in_the_annex__63__.mdwn | 5 + doc/forum/Gitolite_problems.mdwn | 11 + ..._3a41f9b6bddc060b1fa9e35b9ce8b55f._comment | 10 + ..._ef156bf7a1e17496c5fc1f592d45f2ad._comment | 9 + ...ial_remote_when_content_changes__63__.mdwn | 19 + ..._05ee6a1b1943ef3c90634e52233bde1c._comment | 12 + ..._48d82e391812d8ec0d4e6562d0607fe7._comment | 10 + doc/forum/Help_Windows_walkthrough.mdwn | 177 + ..._5fc22393a1b28235eabb2871ad83d0a7._comment | 12 + doc/forum/Help_on_my_usecase.mdwn | 22 + ..._a35b35c7927640f21d47c3df4f91dabb._comment | 12 + .../Help_with_syncing_file_contents.mdwn | 68 + ..._7ec34de3140983739080115c82966bf5._comment | 18 + ..._7dba58d3c62d6f64a270298e4e4329a4._comment | 10 + ..._b26cfa20dc81517d93e760f4809bdc24._comment | 12 + ...in_directory_that_have_content__63___.mdwn | 6 + ..._e897d8fc10474cf865279dc22f22ecb7._comment | 10 + ..._3af326205db6ee04f2a8644baa1dd566._comment | 8 + ..._Android_git-annex_installation__63__.mdwn | 1 + ..._e14757c2c106770c2d7069ace4987b3b._comment | 8 + ...ow_do_I_do_with_.gitrefs__47_____63__.mdwn | 1 + ..._5e235af2ea13fd4f6a226c842f69965e._comment | 8 + ..._50d0c643537175b514d5eae604fb5bea._comment | 51 + ..._3d342c32b14c7edbece596ba970a8415._comment | 10 + ...dropunused_with_an_rsync_remote__63__.mdwn | 3 + ..._8db3cb5348b845eb99c2c829957db9ea._comment | 8 + ..._6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment | 10 + ..._f24d678e4192a70322aa164ed9b71fc8._comment | 8 + ..._9233decd0aaf9211447f36e0d9346445._comment | 15 + ..._e1deb110f752e5495d5c77ec444abac5._comment | 8 + ..._get_rid_of_a_wrong_remote_uuid__63__.mdwn | 16 + ..._b3c215cedba51fb47992ef10c60d6acc._comment | 8 + ..._85415e1fceb737919cc1cd9f37242458._comment | 10 + ..._fb3a591dc60182f7922fc2b5c24f50f1._comment | 11 + ..._aed0be32e579c7a39c63aa7e3ec5f67b._comment | 29 + ..._0c9a6c8a92d6c6e04ae3a8349b799c60._comment | 22 + ...now_when_something_fails_a_fsck__63__.mdwn | 4 + ..._1c14981916dd55376d5e9f95023556cb._comment | 32 + ...ex_assistant__39__s_web_browser__63__.mdwn | 7 + ..._f4402eabda2327da3a0bbc64ed3baf9a._comment | 12 + ..._cdb41f2c7b6bc5bf40d88582dcbf45aa._comment | 10 + ..._ca75e928c245eb23a02b5f40ec69cbb1._comment | 8 + ..._1635f136909711295b9b70d1255e0378._comment | 11 + ..._ee0cbe9498c518de98480a2ad229f685._comment | 10 + ..._799b9d9d3ffbc2c14eca8d442e2aff8c._comment | 11 + ..._71ff45948487e9ac8de809a5ccc3d874._comment | 29 + ...ge_the_number_of_simultaneous_uploads.mdwn | 3 + ..._d5559994ee45a5c185a55c9a4d824aa4._comment | 12 + doc/forum/How_to_cancel_an_add__63__.mdwn | 5 + ..._f768ce5dc7c76f96ee6eb352f167be44._comment | 8 + ...change_the_name_of_a_repo_on_S3__63__.mdwn | 2 + ..._be74d63e1951f515948d232e096b4862._comment | 8 + ..._d54a7163cfe9a94b7ba337860958e5c5._comment | 8 + ...king_of_a_deleted_file_in_direct_mode.mdwn | 7 + ..._c6bd2ef90516dde928ff18ded36df625._comment | 8 + ...7__ssh_backend_to_other_backend__63__.mdwn | 14 + ..._7973928b1aa9e0fcfeb6bf80885441f5._comment | 10 + ...th_renamed_files_in_direct_mode__63__.mdwn | 3 + ..._fe38fedbbc9e4a9e13bf19950e63c7ac._comment | 10 + doc/forum/How_to_debug_failing_sync.mdwn | 5 + ..._a597b868182e55e5f39394f154740534._comment | 10 + ..._db0a5652d76e4e568a4d7808195bc59c._comment | 10 + ...url_for_a_git_remote_repository__63__.mdwn | 7 + ..._52918b5ec25e55837215439fe1bb1a14._comment | 8 + ..._3a1567c9f484b5e12e5560cdcc2cfddd._comment | 8 + ..._48c3a80c14a85f27d742482b2ccbe628._comment | 8 + doc/forum/How_to_delete_a_remote__63__.mdwn | 1 + ..._8cba186bb67079ff41bf6d0b04613f4a._comment | 10 + ..._33c429ffa7e9e2ed9c5fac760ee8e82c._comment | 12 + ..._e9c5508092ca2983f458b16bf1e07082._comment | 14 + ...tes_with_git_annex_assistant_and_ext4.mdwn | 28 + ..._42ca6cfbbb79fe63514805b8119ac16b._comment | 8 + ..._c94ce6a9767c624e2445a7d9eea40396._comment | 29 + ..._bcda51053b62bbb20ce71a59469e1b26._comment | 10 + ..._48e5b9eae920e5f13812de8d6f6bc640._comment | 8 + ..._787c0bfdc1d309db1486c3a37723a957._comment | 13 + ..._8894beb06443f234e9200b03b5f3badf._comment | 8 + ..._457f62ee3e58f68a55f66c5bde6002fd._comment | 10 + ..._bd2b412116a66107bc0ff0efd7e39a58._comment | 10 + ..._of_files_that_have_been_edited__63__.mdwn | 7 + ..._dccf4dc4483d08e5e2936b2cadeafeaf._comment | 8 + ..._5710294c1c8652c12b6df2233255a45e._comment | 8 + ...et_git-annex_to_forget_a_commit__63__.mdwn | 54 + ..._65471c42e163ac8ee6ec109f1397271b._comment | 12 + ..._to_handle_the_git-annex_branch__63__.mdwn | 5 + ..._800bd55b322e72f229882d7fd3888b14._comment | 8 + ...ading_a_file_to_a_transfer_repository.mdwn | 3 + ..._17db96492e6bc0e243fc7cb62565c4c4._comment | 17 + ..._e772ea0383ac690cbcbcf125258986cf._comment | 16 + ...n_releases_work_with_git_annex___63__.mdwn | 5 + ..._9298aa55771b68873de02e6a7964bbdc._comment | 8 + .../How_to_make_a_server_store_the_files.mdwn | 1 + ..._20196067475918e788afa0debc4d5ce5._comment | 9 + ...stant_from_downloading_all_data__63__.mdwn | 9 + ..._fd8b287758ad77b3527ae71017cffabf._comment | 8 + ..._e8e75b4451aaf55461edf2f3d68797ed._comment | 8 + doc/forum/How_to_rename_a_remote__63__.mdwn | 1 + ..._a9bfbd82f7bb47661f0d9e0e0d904332._comment | 28 + ...nterrupted_merge_in_direct_mode__63__.mdwn | 65 + ..._8e2a14842b44844f90c80b862a1b3a6d._comment | 10 + ..._031ab6b5a2765ed9e2b185b24a8cbd78._comment | 8 + ..._93f20519483837c59a75821621e22dee._comment | 10 + doc/forum/How_to_restore_symlinks.mdwn | 1 + ..._c67e752cf7d5431096fab4b3304790a7._comment | 11 + ..._f9ec6096595e2c149c48924e3b54542f._comment | 14 + ..._4ff80729787a2a4e2baf05dd1db37da3._comment | 12 + ...ly_annex_a_file_already_in_a_git_repo.mdwn | 5 + ..._one_shared_transfer_repository__63__.mdwn | 15 + ..._bedaf308cfc70b9e751914a400ebcbc2._comment | 10 + ..._d665b1514253c8aa487ebf8b2728e3b1._comment | 10 + ..._aef42387a3673ab6710fb23e878d7e17._comment | 10 + ..._bfbcc041db472f4808979e6b3d7c4be2._comment | 10 + ...tories_handled_by_the_assistant__63__.mdwn | 40 + ..._1c913395f076ee203caaab057da8afbe._comment | 13 + ..._081793c52bf15c74a7f48a67c49ff818._comment | 12 + ..._f8e0376beb486cf8ce52384ff511ecf2._comment | 11 + .../Howto_remove_a_repository__63__.mdwn | 4 + ..._b55fa4e92bb457ecaa5ca8f5cee7be1d._comment | 8 + doc/forum/Howto_remove_unused_files.mdwn | 31 + ..._f2a7948268ce3cb3967a9fdd8ccc570a._comment | 16 + ..._9b4d198c2d8a52adef3d166a8196fc0d._comment | 8 + ..._441d10901d5c055ac3ed2a6cb61c075c._comment | 8 + doc/forum/Import_options.mdwn | 14 + ..._118a5f978090a3909299876a01c0adec._comment | 21 + ..._21da91f08cb6b28ae3e79ade033db516._comment | 17 + ...de_of_the_object_directory_safe__63__.mdwn | 9 + ..._c25900b9d2d62cc0b8c77150bcfebadf._comment | 13 + ...state_before_the_initial_commit__63__.mdwn | 18 + ..._f9decde3955f10148febc4646fba5a68._comment | 12 + ..._ed32a48edce4f150bedf24cfe91de254._comment | 8 + ..._ef9618850e5e688bac3c646983f00ed8._comment | 10 + ..._4bf460c5826c36b205e418c4f3f7d770._comment | 15 + ...e_git-sync_not_nullify_symlinks__63__.mdwn | 23 + ..._d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment | 10 + ...ebapp_on_Trisquel__47__Ubuntu_Precise.mdwn | 7 + ..._6bd27bd31833336c1df783253378ccae._comment | 10 + .../Let_watch_selectively_annex_files.mdwn | 27 + ..._8379de87d16502d9aadf252da01e4d9a._comment | 10 + ..._2219ff6b4dc927eb2a299cd1af90aed8._comment | 8 + ...ad_of_broken_link_when_possible__63__.mdwn | 4 + ..._ce0464d5fca6ada9f1477831fd47ce09._comment | 8 + ..._or_actual_files__63___Confused__33__.mdwn | 21 + ..._779cee2448d7070b1dd636d01296c01e._comment | 8 + ..._bccda88697ab7beec0b9fe9ee0230688._comment | 18 + ..._c2a9da3f03b55ff294dc0d2010380119._comment | 8 + .../Local_and_remote_in_direct_mode.mdwn | 7 + ..._45f89ebcb6092d1b2582feebc8a5e9d7._comment | 15 + ..._file_results_in_file_changed_warning.mdwn | 20 + ..._25a04c7345f5b626aa71524603c833ed._comment | 8 + ..._7146a3c69749b9b1001fffc6e7a8bcda._comment | 12 + ..._fd39e6ceffd9bf0709658c34945d8699._comment | 16 + doc/forum/Looking_at_the_webapp_on_OSX.mdwn | 18 + ..._68820f2f469356633c1abb18a47e0c59._comment | 12 + ..._4ce86546d8a135df9cfab46b4612fa0b._comment | 23 + ..._6d398a2cceff14a1b774b85ee1725073._comment | 12 + ..._5e503787a4b1d3534c5e20da5480b763._comment | 8 + ..._c735841bc230efc61594ea013fc2902b._comment | 8 + ..._0e489fbfc89d282e9eb47f1b814ff70c._comment | 8 + doc/forum/Lyve_Home.mdwn | 6 + .../Make_whereis_output_more_compact.mdwn | 13 + ...git-annex_a_self-funded_project__63__.mdwn | 10 + ..._4a1ba95b7231ba973ddb672d2419e28c._comment | 8 + ..._7c476ae92e63c991f229708678874ca2._comment | 8 + .../Making_git-annex_less_necessary.mdwn | 5 + ..._03faaa3866778d24cd03887b85dc9954._comment | 12 + ..._2db02a94dffd525885c9d7fc6c5fa464._comment | 12 + ..._429ec656e0ac02f98843f8d7f3c02d6a._comment | 11 + ..._384813dd022dfd9c1ef14e0f1479a123._comment | 18 + ...ead-only_medium___40__E.G._DVDs__41__.mdwn | 118 + ..._a061d300b718ad943c940e122cc57220._comment | 23 + ..._76529080054407570611b4357ce4f3ed._comment | 8 + ..._9acf5ce41a023f3848a51891cceeb51b._comment | 21 + ..._25e65ee3949e7d918376298cf11585f2._comment | 10 + ..._8a71ca048f9de29a198a6afb17d5315e._comment | 11 + ..._e3d1d3a3d3d831432ec940a8ab6f31e9._comment | 14 + ..._26a33eae98b4faaf6baf6635e3d28a8f._comment | 27 + ..._49ac298d39c824b0e52a239961463e09._comment | 14 + ..._55a4a3616ea59654da1c2f9902561e3b._comment | 13 + ..._92a2af3e0e328bb48bcc67a69187ee57._comment | 13 + ..._f6e39e71882d55cdc061166aea3e2bd3._comment | 26 + ..._6c45a6264d69e22800c329a0f8a2d470._comment | 8 + ...multiple_annexes_with_assistant__63__.mdwn | 13 + ..._ba8c70e4a46441b48ad910625636eee5._comment | 8 + ..._4b4f0a7d84a51ae92536e2c190256069._comment | 10 + ..._86daadc565f96db5db13b6dbcbc66db3._comment | 8 + ..._e43d71ddfdfdb7bcb13bfb894de6a5ec._comment | 8 + ..._e94d33be83b45918d1a39d6e16fba4b4._comment | 8 + ...tiple_repositories_concurrently__63__.mdwn | 5 + ..._ebec1ddad71e961cdc9b21cbddfbcdaf._comment | 10 + doc/forum/Manual_Setup_of_a_Central_Repo.mdwn | 1 + ..._3a163fd5629dc40423f1290a78ae1c07._comment | 12 + .../Manual_commit_message_in_direct_mode.mdwn | 3 + ..._32f95eefec25bb127ed96248446c21b1._comment | 8 + ..._bf1d10067379c802ac5020d8becd6d35._comment | 10 + ...l_mode_option_in_assistant_auto-syncs.mdwn | 11 + ..._4a0468b6ca2ffff8ef8f19800597567d._comment | 10 + doc/forum/Manual_webapp_behaviour_on_ARM.mdwn | 15 + doc/forum/MegaAnnex_not_working..mdwn | 32 + ..._5aa3fd366d4c78ca79bb58005a49791c._comment | 8 + ...Missing_git-annex.linux__47__runshell.mdwn | 44 + ..._f29a5105649579ef15e79d983c4e1f8e._comment | 8 + ...d_in_synchronized_remote_copies__63__.mdwn | 5 + ...ithin_the_repo_without_copying___63__.mdwn | 19 + ..._9e3290138133d5a23a80f72342f47ec4._comment | 8 + ..._232b77894dda51d02cbc34bd25d3213b._comment | 13 + ..._d35ac1bdb3fa6e303ad92348ba174158._comment | 11 + ..._4b443ec6b47eaabe214d0c2222083e4a._comment | 8 + ...s_file_content_without_doing_checkout.mdwn | 4 + ..._f114b75b29123453758b493fae7f5167._comment | 8 + ..._e377b7614c2961b460a10e285f3db274._comment | 10 + ..._d251958795ab0867c65cf182e54a6ffe._comment | 8 + ...r_some_weeks_with_git-annex_assistant.mdwn | 57 + ..._9d4019a54fb508e286a5d6d2660361d9._comment | 26 + ..._109534a45881ce94a4586c8a83945f9f._comment | 85 + ..._build_instructions_for_Debian_stable.mdwn | 5 + ..._8c1eea6dfec8b7e1c7a371b6e9c26118._comment | 8 + ..._f6ff8306c946219dbe39bb8938a349ab._comment | 21 + ..._bcda70cbfc7c1a14fa82da70f9f876e2._comment | 8 + .../Need_some_help_to_fix_my_repository.mdwn | 31 + ..._f0d279c530b796b2c93d793f85d147e8._comment | 13 + ..._a3fcfa1f8eadec5fa8a9efacca174048._comment | 10 + ..._7878f9b76ddfa3392c9ec6a1810cb745._comment | 10 + ...nused_files_because_of_bad_sync__63__.mdwn | 23 + ..._af0ed0730645c1e3c9a4946acd48c18a._comment | 8 + ..._12f3c2bb2458b69e6355c8f94bab868f._comment | 13 + ..._b233b4daac32c452776e1e3d9a29f2cc._comment | 12 + ..._8e079e92929dcfdf19f6adec16f800e5._comment | 23 + ...nnex_integration_mode_for_Emacs_users.mdwn | 3 + doc/forum/New_user_misunderstandings.mdwn | 24 + ..._c1785924109b5d5cde9aa3d3460cf955._comment | 10 + ...to_connect_to_the_Jabber_server__34__.mdwn | 5 + ..._59158afcedac18a7285d57491b2a468a._comment | 8 + ..._2a70ac08bb95774415b09dab7d7f8605._comment | 8 + ..._92a52b523ed4c68b70ddcabc2a050b76._comment | 12 + ..._c52a75761ea107f6d69c09bac64f0f0a._comment | 12 + ..._2685e3a87464ccd37d593516d94ba5cf._comment | 10 + doc/forum/No_SSL_traffic_for_S3__63__.mdwn | 8 + ..._f509bf273896180e6df8c771438dd093._comment | 11 + ..._358635d19c82202c63014ca84de7fc3b._comment | 8 + ...git-annex_status_v5.20131224-g692aa01.mdwn | 16 + ..._b014f1edcb7ce39da9b582683d3b80c0._comment | 10 + ..._24602de6cfe1f3d988c5105e7266a518._comment | 8 + ...Not_sure_how_to_get_my_s3_remote_back.mdwn | 31 + ..._ed35a6ec605e8f79ec107856af6d1a46._comment | 18 + ..._e48b6efa42159dc83e1be11bfb54abcd._comment | 14 + ..._b58232d0e3fa4649565c0c7d4ce2e82e._comment | 31 + ..._85368b60091dc3ce2efb58013ffe9f83._comment | 10 + ..._e65281bef23e0076936c508728a87897._comment | 25 + ..._fffb59ad5a197d2980dd0ec35cf4aafa._comment | 10 + ..._0cfcc2075bff556b9fde5acc3dc1d599._comment | 8 + ..._6fe2ff1282fb14a4ce26ef8dc775d07e._comment | 8 + ..._64338d2d77dcbabd16b55eb145f40dc6._comment | 12 + ..._dd66c9ea0c83388f6826751944330d10._comment | 16 + ..._dc0c5e395e4c443b7227afdb157194e5._comment | 10 + ..._3c0ea4c76cdd889707f7308576e3efa0._comment | 65 + ..._36519ee4499a19f0864e4fcd264e9933._comment | 20 + ..._85b23f375e53469fb09b24b945b3aba9._comment | 17 + doc/forum/OSX_Mavericks_anyone__63__.mdwn | 3 + ..._3075b02aeb57adcbf4addf9fb4c123ba._comment | 11 + ..._c2b6110fc4a3d3481ed8a4b48efb9635._comment | 17 + ..._7df9ba63cb1f385681242b4b58d6a87c._comment | 8 + ..._740fee31c4ca9d84428f97f63ffc075a._comment | 8 + ..._sshd_behaviour_has_limited_paths_set.mdwn | 12 + ..._a136ff877389f0930c066ba118edd9fd._comment | 10 + ...kell-platform_statically_links_things.mdwn | 17 + doc/forum/OpenOffice___47___Libre_Office.mdwn | 5 + ..._98ed542fedd820d47bf8deb7d3232725._comment | 8 + ..._f313fdaa23863c2ae99cfbfe9ec2e1e0._comment | 8 + ...___whereis__44___find_and_status_cmds.mdwn | 5 + .../Overwriting_data_without_getting_it.mdwn | 3 + ..._f1c0199ee9bffcc84287370b89361294._comment | 26 + ..._6a1d08dbca206129ef6cf8aa97daeee1._comment | 8 + ..._52958e76e506fdbb6b533681ab619b3b._comment | 8 + ...ns_of_triply_nested_objects_directory.mdwn | 23 + ..._068a8f120d188b8fa5d3e5b687fd02dc._comment | 8 + ..._cc0f5be21fd1523bdddc7bcf6ff04435._comment | 10 + ..._1133795276371c86cdd52b25a8b20c52._comment | 28 + ...ickey__41___On_second_Step_...___63__.mdwn | 36 + ..._6c74f0b43c457fe97b2d8630ca4fde29._comment | 10 + ..._b7a384e853e1756a684774348fad29e6._comment | 22 + ..._3a8a7f51cb04a92c576549d379b57248._comment | 12 + ..._582ad3ba0c62a77b08a10b37a780c670._comment | 15 + ...Please_fix_compatibility_with_ghc_7.0.mdwn | 1 + ..._d1d10217ebd0151e947b3a6cd37399ce._comment | 8 + ...new_releases_not_shorter_than_11_days.mdwn | 6 + ..._da3d39de5be47ebe8b25a42ed1f36510._comment | 8 + doc/forum/Podcast_syncing_use-case.mdwn | 34 + ..._ace6f9d3a950348a3ac0ff592b62e786._comment | 10 + ..._930a6620b4d516e69ed952f9da5371bb._comment | 8 + doc/forum/Poor_man__39__s_IMAP.mdwn | 6 + ..._258ff23c462dc88b88ced405c4f5040f._comment | 11 + ..._c88d1abdda4cb526a6ee45a710c75bc4._comment | 10 + ..._3847e371db1c2788c075e7dca1fbd33e._comment | 8 + ..._cf6cc21f2cf2aa5c949844e24a7b4075._comment | 8 + ..._d861fa69475ce526841b3195be8ee356._comment | 10 + ..._1e81bd4bb62652bc674cdcd7ed57ac5c._comment | 12 + ..._b3929281dff6078d77f1b9ae42e25bb6._comment | 16 + ..._69506e8c519196f44b9ed15b32f00106._comment | 22 + ...able_version_of_git-annex_for_windows.mdwn | 22 + ..._e5e60fa8d104a09152a8164d5a906aec._comment | 10 + ..._d8d1aa0920351e880ba6678bb97585de._comment | 10 + doc/forum/Post-Kickstarter.mdwn | 5 + ...in_directory_tree_below_objects__47__.mdwn | 77 + ..._5dd978f9b5a0771f44ab9e086bf5a07f._comment | 14 + ..._9f51947b35ee04e473655e20d56c740a._comment | 16 + ...revious_versions_in_direct_mode__63__.mdwn | 3 + ..._352d460acd5500587e679d934180eee4._comment | 10 + .../Problem_compiling_current_master.mdwn | 12 + ..._135df61ec850c06e3b48ccfef7b5b031._comment | 8 + ..._fb3e27b6014e84bd919a7a4a95e39ef9._comment | 20 + ..._b737b3945103c5e2aa798b4e65fbce06._comment | 8 + ..._28c1b335ae388d4e1f22b711ac1c001f._comment | 8 + doc/forum/Problems_syncing_with_box.com.mdwn | 26 + ..._8db642849da4d42cd9a43142e2b7cb70._comment | 12 + ..._cd18f33647aebc04af5469e4ce1fbcd2._comment | 11 + ...using_submodules_with_git-annex__63__.mdwn | 1 + ..._c7a927736d419d3c31c912001ff16ee4._comment | 7 + ..._26f6581b5969eb2cb77495c40de88951._comment | 11 + .../Problems_when_cloning_a_repository.mdwn | 22 + ..._191c091c384d8d97d24f8a77e8ff90ee._comment | 9 + ..._74ccbb09677444478074e9eab405fbaf._comment | 16 + ..._3436e26dd9fe07233a070d4e95d81cdf._comment | 16 + .../Problems_with_large_numbers_of_files.mdwn | 8 + ..._08791cb78b982087c2a07316fe3ed46c._comment | 22 + ..._0392a11219463e40c53bae73c8188b69._comment | 25 + ..._537e9884c1488a7a4bcf131ea63b71f7._comment | 8 + ..._7cb65d013e72bd2b7e90452079d42ac9._comment | 29 + ..._86a42ee3173a5d38f803e64b79496ab3._comment | 14 + ..._4551274288383c9cc27cbf85b122d307._comment | 11 + ..._d18cf944352f8303799c86f2c0354e8e._comment | 8 + .../Pruning_out_unwanted_Git_objects.mdwn | 3 + ..._0cf7a12bfa2957260f4b2f79b0cadf2f._comment | 8 + ..._7472943c02cfe2808b0d566e06caa1a5._comment | 8 + ..._6a1e7a83d94394454fc085f6d2728cd7._comment | 8 + doc/forum/Purge_a_remote.mdwn | 2 + ..._78b3b77f457c65d31fd8a5abf714905d._comment | 8 + ..._dc65719157dee63b3979563ed57ee0ce._comment | 10 + ..._63e0280273b816fa4b837724e102f813._comment | 8 + ..._7fad1c4798ca03a4095ac3241c279f6d._comment | 11 + .../Push__47__Pull_with_the_Assistant.mdwn | 1 + ..._f7b63d379c2d21794adf8658f546f8a7._comment | 10 + ..._aec8cc20576e7ffd5a8be4348d1a0073._comment | 21 + ..._git_repo_to_AWS_S3_from_behind_proxy.mdwn | 9 + ...Reappearing_repos_in_webapp_and_vicfg.mdwn | 43 + ..._bd977e864ae89816fa7f4ff69879b15f._comment | 8 + ..._05749f9e75689d0111339b7126c12300._comment | 15 + ..._b1531994eea0fbbf4cb097e604378a53._comment | 12 + ..._f1eba3e8aa4116e3c20747ec1d6e24e5._comment | 12 + .../Recommended_number_of_repositories.mdwn | 4 + ..._3ef256230756be8a9679b107cdbfd018._comment | 15 + .../Recover_files__44___annex_stuck.mdwn | 28 + ..._6d85c3ec73ddc0682d9643f4d5eeda70._comment | 18 + ..._52e799bb6f24a1ebed58fad6cebd3a71._comment | 17 + ..._686a285bc7e950aae67856c47e7cb21e._comment | 18 + ..._a4d62d494b340458e6535d573bade965._comment | 12 + ..._c10f0fe1440ccd170804a433db2267ee._comment | 12 + ..._14446cafac6c33a3f95b5344c42c0bef._comment | 14 + ..._63c19f58b7e95e39ba25a735bdcc0bcf._comment | 10 + ..._8e5c7572ab8d1f0e41fedf6f805b942a._comment | 8 + ..._e5357c63107f79571bd3ff609b4406a7._comment | 26 + ..._3316652073710f39965cd49ceea5c4ff._comment | 8 + ..._d605f755c363d56cf5f1060ad06ee173._comment | 8 + ..._f3ee184a4d3b8d82a8a362a6c03a54a3._comment | 54 + ..._341b47663d133411587ec70ef2b178c6._comment | 14 + ..._66c0d9284d5edbac189a64b03c4fe50a._comment | 10 + ..._8b32f6597f447f88bee7a80698fb4df6._comment | 18 + ..._4cc81169e99a453cdb6e83e57e638f37._comment | 8 + ..._2d104cf4682e04906f8ca0ced7288cf1._comment | 17 + ..._d356c4fce9f1197e5292f9dedf85bbc9._comment | 22 + ..._856c7e1575f5d99530ecd54004315487._comment | 12 + doc/forum/Relocating_annex_directory.mdwn | 1 + ..._13ff5438baa1db110beb6aab3a783def._comment | 11 + ..._6d88ff03fcf00ae872442e8a86c968ed._comment | 10 + ...te_server_only_for_the_git_repository.mdwn | 3 + ..._d4d8d8cfebf9a98ca8878c5684d5bb50._comment | 10 + ..._a62dec8ab98ac7bd65059a9e425a01e2._comment | 9 + ...g_files_not_found_by_git_annex_unused.mdwn | 29 + ..._420c6230e68de0a0ac7d7da91ac60801._comment | 8 + ...__dumb__34___client_without_git-annex.mdwn | 11 + ..._077c492fd37d335f74a5c886ff0d524f._comment | 32 + ..._00e6576e3e60d2650461eeb0f918e6e5._comment | 8 + ..._c36a9562c53ac683b62fc4471405aa2a._comment | 15 + doc/forum/Restricting_SSH_+_supply_key.mdwn | 7 + ..._8bbd0b6488c23ce8b182bd6b1765c94b._comment | 11 + ..._cac35ac1ac0b300ddfac5ffc74291bce._comment | 12 + ..._e9803dd1794b4d078efa9435ff5ba295._comment | 19 + ..._1c3beb859e76cb69d2bacd2473ec72b7._comment | 10 + ..._1c541fc9a44e5cfb13c7d3ef0eeba2c7._comment | 23 + ..._4dbd5605f2638de0a3edfb3886a47938._comment | 22 + ..._a9c5b424a6acb2da152bf87b2e7617bb._comment | 8 + ..._93b7c2a5947fb6904c88cd5c120e404c._comment | 16 + ..._beaa350751eca4642545d1b83e528dd7._comment | 10 + ..._2faceeaf0d39f82e5d624eae19e4ca53._comment | 31 + ...-annex-shell_to_a_specific_repository.mdwn | 25 + ..._66544520bff71181e4a03ca583b0b458._comment | 12 + ..._2a210255e8535712c71fa183e56ab600._comment | 13 + ..._52cd4bd9694b2100b0e0dd2eafa9e828._comment | 8 + ...rieve_previous_version_in_direct_mode.mdwn | 5 + ..._ca3a999ed64c42b8df810115de205d2f._comment | 12 + ..._1292b34ff6d9976b2bd08748e1ba4e7a._comment | 8 + ..._699e816c0397f6db924feeab906f1151._comment | 8 + ..._d900388753de5870b7b9c0e8b8c06ed7._comment | 8 + ..._1360b936aa389a0ab5e5e453824b2ece._comment | 9 + ...Revert_file_linkage_to_original_files.mdwn | 9 + ..._898ca2c9976e92d22470c7404aa9813f._comment | 10 + ...t_to_a_precedent_state_in_direct_mode.mdwn | 3 + ..._1ae9f7defbab44621c3108973a4f683a._comment | 26 + ...n_a_server___40__no_X_available__41__.mdwn | 2 + ..._dd75d78ef63f2689199a302ed1846017._comment | 8 + ..._df654df60c5fa6a84d786d248928a352._comment | 11 + .../Running_assistant_steps_manually.mdwn | 20 + ..._e14e0a1d55d01cb4f67a94bbe349b872._comment | 20 + ..._3192f614c929b8060d4fbde56a7adec1._comment | 14 + doc/forum/Running_out_of__inodes.mdwn | 17 + ..._abc73d9ad662ef642337b683bf0a0253._comment | 12 + doc/forum/S3_Host_Question.mdwn | 11 + ..._8c8ecea703405753e47e0da5e8325929._comment | 11 + ..._3d6fa3147d59a5e0d10b005388b23c7a._comment | 8 + ..._797edf3ad41561ab8960f3b28d20611e._comment | 8 + ..._Jabber_account_for_different_annexes.mdwn | 1 + ..._90c3954fe11980eef42b5f5d34f83488._comment | 8 + ..._802600b3568e5f94d0550092b22975db._comment | 8 + doc/forum/Securing_a_shared_ssh_server.mdwn | 3 + ..._ea971b57d94db5b8d487f728faa5e9a8._comment | 10 + ..._421a19f6e1fb40db6ee205daf8e3f867._comment | 15 + ..._acdbf92f646dbbf691621f08b3d94c26._comment | 12 + ..._67533d08e1b8706b844262e9c483d982._comment | 15 + ..._bf193e02b388b4358632a169d2425b5c._comment | 10 + ..._50d391992cd444080ebc70db30b215c5._comment | 9 + .../Sending_requests_across_the_network.mdwn | 15 + ..._8ff713d4c968705061bf2044ea0fe5a0._comment | 10 + ..._cb29e5346a8775d87d30b18b7fc005a7._comment | 10 + ...ial_remote_with_non-standard_ssh_port.mdwn | 13 + ..._1eb6990e93ec92cb6fd7dbee59f31072._comment | 13 + ..._c85d5167e7ccce1ecf1de396e72ce7bc._comment | 8 + ...files_of_a_repo___40__Assistant__41__.mdwn | 6 + ..._ec0d56cb31b918023a9184cee168b406._comment | 8 + ...are_with_friend_copies_only_sym_links.mdwn | 38 + ..._a8d22dfefb219f0c9130cc294364b198._comment | 17 + .../Sharing_annex_with_local_clones.mdwn | 1 + ..._2b60e13e5f7b8cee56cf2ddc6c47f64d._comment | 12 + ..._24ff2c1eb643077daa37c01644cebcd2._comment | 8 + ..._5359b8eada24d27be83214ac0ae62f23._comment | 8 + ...Simple_check_out_with_assistant__63__.mdwn | 2 + ..._ade8a0743ef1ec933c8a40ed64eeac2d._comment | 8 + ...y_finer_control_over_file_whereabouts.mdwn | 18 + ..._bcb883d46a637dd1a8ef9a92733d202a._comment | 10 + ..._b7a8b9eaf114f883866fbf2be51b622f._comment | 8 + ..._6236bcfa9beba705ead3ec2141c5d835._comment | 8 + ..._ea935b37ca93e73c85d04df7c9bf6057._comment | 12 + ..._f89a8e38283ac4c8c4a3b74c413d67a1._comment | 8 + ..._07a0a754a089c46ff69dc97ea7ba9384._comment | 22 + ..._e884c001a556a0c693d1cc9a97c068ac._comment | 8 + ..._3e8674b5857e4994dfbc26be4f4b2855._comment | 25 + ..._7aeabc2e52a39423e83fbd04560e8f91._comment | 8 + ..._53b95449cfad2fe0f72d2ad642822c03._comment | 15 + ..._a17c102a45e4fc3f101a79acb8eb4081._comment | 18 + .../Some_mounted_devices_not_detected.mdwn | 3 + ..._0ba07b95f12f57ea63bb450b88430c45._comment | 8 + ..._4f8c7bcd0f20dafa5635a3580ec8d1f6._comment | 13 + ..._06c0db7d670d9b82823102d22db15a36._comment | 10 + ..._80820a29361c5be4a94672dacfdefa6f._comment | 8 + ...ts_of_directories_in_root:_000...ffff.mdwn | 22 + ..._20147b287fd995fa8ac9e868b5974d8a._comment | 12 + ...al_remote_public_key_encryption_issue.mdwn | 18 + ..._a9caafea017a3c148f89d4ddeee15a4c._comment | 10 + ..._adfa582d611ca501e21110282df07315._comment | 18 + ..._eac16bf98a6e87461ba2f3ab7e990b2b._comment | 10 + ..._097f52aaf178340b3abb5bfc80f0d447._comment | 8 + doc/forum/Special_remote_without_chmod.mdwn | 12 + ..._4f5f9506cae72a1f321296fc5a5f339a._comment | 8 + doc/forum/Ssh_remote_on_NAS.mdwn | 34 + ..._1dd8a0d0e70a1fb36fce62e89c99b404._comment | 10 + ..._261601313d8825c52322949b8509bc74._comment | 16 + ..._ed602f4f972b78bce4f62bdfca8cfe47._comment | 11 + ...andard_groups__47__preferred_contents.mdwn | 14 + doc/forum/Starting_assistant_from_CLI.mdwn | 9 + ..._afd51ddb0f1bb3cac528e1d96829ef83._comment | 12 + ..._76c34c00cf2065809b15a594023a688b._comment | 11 + ..._f7826867f78b1adbfc2dad2fad4d6720._comment | 17 + ..._fa7055a232a1dcb743db47308f7acf0b._comment | 14 + doc/forum/Storing_git_repos_in_git-annex.mdwn | 27 + ..._ac7b52c0b0f75d79760ffe6a9b5c8759._comment | 20 + ..._3bec1f02ff1a61791e3cbb428c7acb4c._comment | 12 + ..._76ddbd27cc2f3785bb5aaebb0bb6e087._comment | 14 + ..._f9520cbc6669622aa342acad35581943._comment | 14 + ..._d5676400e7148b7d3408f2bdb3d54b7d._comment | 8 + ...toring_uncontrolled_files_in_an_annex.mdwn | 3 + ..._175645a90be0c79221c129308adf643e._comment | 27 + ..._d29f214eadfe3bfd098bbc3bcf07129a._comment | 8 + ..._286b502e7906cca50e9e747db735bc88._comment | 10 + .../Stupid_mistake:_recoverable__63__.mdwn | 31 + ..._00ceb3a5e37825c4bbc806f532893706._comment | 23 + ..._cbedc29678d9b6af3b3c0bb1915d2391._comment | 12 + ..._86aa4d92a1330811862da1ba568b3037._comment | 42 + ..._6d15bf8a3c3c27cc92957070161675a9._comment | 12 + ..._f836b9b1d03d94c49e3798961790b2ba._comment | 21 + ..._ssh_server_back_into_android_version.mdwn | 9 + ..._5c2f376a82458c6387560355940419d3._comment | 12 + ..._6321dec0b2f22f841f3cb986e063113f._comment | 8 + ...ot_available_from_my_central_git_repo.mdwn | 7 + ..._b31d02c97447996495de73705ac39f71._comment | 12 + ..._098465ae8af32931779d2cd63750d5dc._comment | 10 + doc/forum/Sync_with_one_offline_peer.mdwn | 11 + ..._3859d842d4f7e2ef44877b05ebe881fb._comment | 20 + ..._c9ba3983b37b0c1868269616fd81e518._comment | 14 + ..._28b9c003b4560c3ce90c9ebf808b091b._comment | 10 + doc/forum/Sync_without_jabber_account.mdwn | 9 + ..._3e95ac2e67451f953cf0538094109f8b._comment | 10 + ...ize_large_files___40__VM_images__41__.mdwn | 10 + ..._619f6ed2d7da5832ab253d61b6dd8044._comment | 10 + ...yncing_machines_on_different_networks.mdwn | 9 + ..._1c3523c722c178a96b096a68b9be4165._comment | 8 + ..._d7b14ffee65072329cfe9ab08a0dba50._comment | 8 + ..._65d1dae9b76fccb5f2b8fd8c69b60075._comment | 15 + ..._2ec67428af69d6c0ea051c6a67d58905._comment | 10 + ..._5ce093f82a2aad3fd8d7ccd5fdcab94f._comment | 8 + ..._a55982c28d7b90e0b70ec2bb5e594e08._comment | 8 + ..._c519d546e1a2a4e834609f3de3a605b0._comment | 8 + ..._84a822238ddbaf211cce5f527c3559d3._comment | 8 + ...emote_from_a_different_computer__63__.mdwn | 4 + ..._cd55d06a4065b9d3f14d50674c3fcaf7._comment | 8 + ..._25cbdf478091af9923090e049c432a7d._comment | 22 + ..._7e71d355457d6b1a0391d4cdae6895e6._comment | 16 + ..._a73f67f2fcf0762fbd7c8366b3844af6._comment | 11 + ...nisation_between_3_repositories__63__.mdwn | 11 + ..._ca5192a26950627a1c2efcb55d6d2fa3._comment | 10 + ..._while_committing_it_repeatedly__63__.mdwn | 3 + ..._3cbe520b184d323219cb402ff046c3b4._comment | 29 + ..._6afe7f593e955db2eefe87d9fa01882b._comment | 8 + ..._209399487fc4f76b29f03ad82dbc2d6f._comment | 8 + ..._f33fd6f72cb9ad7dd20a04c82199413b._comment | 26 + ...ory_with_some_hg_and_git_repositories.mdwn | 1 + ..._9fc3f6c2f7379755e0084a850fa9acd4._comment | 10 + ..._f024d6a105143af1e06aafe49661ee06._comment | 8 + ..._aff0093c38bda8b093f05e8cbe8775e9._comment | 8 + ..._c889050d3079edefc4633451bd5baff8._comment | 11 + doc/forum/Transfer_remotes.mdwn | 3 + ..._c08cf3bda00d7f20a3ca3d0fdba19c9c._comment | 8 + ..._98930629d398329f1161135464a966a5._comment | 12 + ...stalling_from_cabal_on_debian-testing.mdwn | 15 + ..._0d3e9d7cffafc34bc212557e8bbb987d._comment | 12 + .../Truly_purging_dead_repositories.mdwn | 1 + ..._a4c75d49714b3543a9f1617a15d4a2d1._comment | 8 + ..._3da60a02e7323a204c5c5dd02ba04d6c._comment | 8 + ..._2576e45436008ff5a7ae5a38cade658e._comment | 8 + ..._477e3c213c5a5d4a33afd42a5b94c718._comment | 10 + ..._backup__34___repository_groups__63__.mdwn | 18 + ..._b8702892280447193e6e80be22a580a0._comment | 11 + ..._50cafde7e30b928480d1f142ddd763d2._comment | 10 + doc/forum/USB_backup_with_files_visible.mdwn | 7 + ..._2832f8ae24dfb0f101e06f7c18283028._comment | 10 + ..._6163e01aa441f8435091f026cc6da337._comment | 8 + ..._ee92ff320eb5d9a031bdd1896aee0d86._comment | 11 + ..._437c8342c0b65e3a89129800313eb73c._comment | 10 + ..._5e10cffe8465ea4ecaa71c03a4c29ea4._comment | 8 + ..._add048a16837f7940a859f21426cdbe9._comment | 8 + ..._de227ca9911fe57d7a6d3e037f574fe9._comment | 14 + ..._0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment | 10 + ...nsfer_group_keeps_growing_-_assistant.mdwn | 22 + ..._0a6f6054d70009979f4a036e24b7c500._comment | 10 + ..._f9eef3019fe690e90c1228d62a16f70a._comment | 10 + ..._7fb74f7fab6c1baff4ffc270cf15ef0a._comment | 15 + doc/forum/Ubuntu_PPA.mdwn | 3 + ..._b55535258b1b4bcfc802235f0cba075d._comment | 8 + ..._adc4d644fed058d1811acf0b35db9c18._comment | 8 + ..._fc9cd51558c47718f243437202a11803._comment | 8 + ..._3a8bbd0a7450a7f5323cd13144824aea._comment | 12 + ..._2e1beaeebda0201c635db8b276cedf20._comment | 12 + ..._bd99fb70399fc58d98781a89c6d38428._comment | 8 + ..._c3f7ec8573934c59d70a48e36e321c13._comment | 12 + doc/forum/Un-git-annex__63__.mdwn | 6 + ..._6059265afb66190d325083e0f28bcf33._comment | 10 + ..._fac4bfb81dbbf0dc82059aace261eb51._comment | 10 + ...ndo_Git_Annex_Changes_To_Linked_Files.mdwn | 7 + ..._568dde820c2608d86d05b07444146a26._comment | 13 + ..._a8cf71cdf1217d9c8596cd9006eb83f5._comment | 8 + doc/forum/Unknown_remote_type_S3.mdwn | 5 + ..._2aea2cd51286c809427d16519606cd37._comment | 8 + ..._06f775062cd30767979fe56bcb3cf7bf._comment | 8 + ...files_when_assistant_is_running__63__.mdwn | 13 + ..._3f4aadf0c856c81e15c6f5ae7f1992b4._comment | 10 + ..._a76797ee9e05e43af7947508cadd7bed._comment | 9 + ..._syncing_only_a_subset_possible__63__.mdwn | 13 + ..._a0a272a0931b27e5c94b93e42656b62c._comment | 10 + ...tead_of_re-downloading_from_S3_remote.mdwn | 3 + ..._cfb6021a36eee087705967a69967f327._comment | 10 + ..._7268b194ba72331858bc3274996b780e._comment | 11 + ...s_on_BTRFS_instead_of_symlinks___63__.mdwn | 1 + ..._85806316ed28d7a891f04fab4027141b._comment | 8 + ..._ecb411a2c4d67917b734a90bd460d44b._comment | 10 + ...__while_also_cloning_and_syncing_too..mdwn | 11 + ..._30205c1ba18e5dca2314f593e1a0e236._comment | 8 + ..._f8df728de28218a6b060ae9f08adac79._comment | 8 + ..._ba438b3a371261ee841665f1ae57eba2._comment | 8 + ..._9f72e6c7c14a77330297526aef260762._comment | 11 + ..._a06e8c9b4e30c1cd6cbed40d2db50abc._comment | 10 + ...__41___to_manage_photos_with_Shotwell.mdwn | 13 + ..._5e8d54daf6b7ff357619ac65fe39a2d7._comment | 12 + doc/forum/Using_Linux_static_builds.mdwn | 25 + ..._22fd266cbe68af3e754a10f1f1295e9b._comment | 13 + ..._36f69f30117ff8696425a754ab19a08b._comment | 8 + ..._64506833dad0202626239e00d1eb6490._comment | 23 + ...sync__34___to_sink_all_branches__63__.mdwn | 9 + ..._ef3d5c5e2600ffa36dd933c8a42cdf96._comment | 16 + ..._424b0c6fdfe87ca08f5d408b7684ab08._comment | 10 + ..._adaf9114c69f1268330adcebd8018fa0._comment | 10 + ...ltiple_independent_client_repos__63__.mdwn | 36 + ..._c61c28600f1079fb03ddabc950307f27._comment | 11 + doc/forum/Using_for_Music_repo.mdwn | 13 + ..._3488ed85ad98f14cb17f229225ece26e._comment | 10 + ..._c794648878cfc77558f8db862271f997._comment | 25 + ..._8c5e820f5ff7d717d64b1fd66927941b._comment | 8 + doc/forum/Using_git-annex_as_a_library.mdwn | 1 + ..._1f8e74c5856f21c53d5a91892cbef0c6._comment | 8 + ..._11a243fa7d8ac947aa9a798228dbd191._comment | 12 + ..._ac52304a096ebc66967352efaffb060a._comment | 8 + ..._d502fea60bf3a82f8a50f72a90a80c25._comment | 8 + ...ng_git-annex_via_command_line_in_OS_X.mdwn | 3 + ..._1c9e121f60fb6868c07f1a53b03c4ed0._comment | 8 + ..._52d8ffba82e29ac2722a8e43e469cc47._comment | 9 + ..._which_only_has_exFAT_and_no_symlinks.mdwn | 8 + ..._b9f202a30ba7e3bc264064d24454c099._comment | 12 + ..._1334a8d9f4bb60f3bf3ebabc656d98d9._comment | 18 + ..._076f22d05fad140068a540e4d835106f._comment | 8 + ..._c8446ee1b817f1824fa0df07e742015c._comment | 12 + ..._f746c1b85ee8e4b57b6819ccceabd28b._comment | 8 + ...7__FTP_TV_NAS_with_preconfigured_dirs.mdwn | 5 + ..._bd73c8d10028e1b45da9ea8f657e5064._comment | 10 + ..._16c3c994ee8fcb466e52ca0e812e5915._comment | 8 + ..._ac60f6edb76bdd541711e472eec9591a._comment | 10 + ..._2194f0600d9a90f0d9c947ea9cc213a3._comment | 8 + ..._eb7d13f6b6fa674a2536bde51bfc3fd1._comment | 48 + ..._ae323b16ddb9342e91be955408eca3b1._comment | 8 + ...iew_performance_with_7__44__000_files.mdwn | 26 + ..._e45ea752100d09d29efb6136a722eab3._comment | 34 + ..._b1942eed65e9b5c046095a094191a38c._comment | 8 + ..._e6e19339c9d72cf8eaae32ef4269e850._comment | 10 + ...ker:git-annex_has_text_relocations....mdwn | 7 + ..._fee360353f0b46aab6ee7a902c0837bb._comment | 11 + ..._me__44___what_am_i_doing_wrong__63__.mdwn | 16 + ..._cdac15fec6fc41d5487b7f653fa718a4._comment | 14 + ..._82050b7dc367ca5968ab0306db9bd7e3._comment | 10 + .../Walkthrough_for_direct_mode__63__.mdwn | 1 + doc/forum/Want_to_stop_using_Git-Annex.mdwn | 9 + ..._32e37515bd4f5d22ff9aedd3c9d98046._comment | 10 + ..._e29e6d052ef3677ad7d5615721f3fe33._comment | 8 + ...__assistant__47__webapp_documentation.mdwn | 12 + ..._adb377589dbae7fc91001df235c6b48e._comment | 14 + doc/forum/Webapp_not_watching_repos.mdwn | 1 + ..._02735050122afdb6498d91b462d32767._comment | 12 + ..._8ab2d4c18ddc99774e44c4f4401bfa57._comment | 12 + ..._b448aa5a95a57a5228b361390e5fc838._comment | 8 + doc/forum/Webapp_on_ARM.mdwn | 6 + ..._82ac40cef5b59070136527b8d81a5ce2._comment | 10 + ...vior_with_OS_X_Finder_and_Preview.app.mdwn | 12 + ..._8c8d86790a9d31518f9bb96a2d2dafee._comment | 18 + ..._b538dc2c6f122b9ce5f7569de1b03f3e._comment | 8 + ..._16e6724fa184392d4decbe0c4eb6efe6._comment | 14 + ..._e514fe2d4d0ad6a10e281939e6ab4266._comment | 15 + ..._e0eec765f72f7bf6f5a2a92c9b5dacad._comment | 10 + .../What_can_be_done_in_case_of_conflict.mdwn | 7 + ..._5ca86b099dfa08a50f656ea03bf1dcd9._comment | 12 + ..._69ee17959a92bb8359c0fd7b2a9d8dfb._comment | 10 + ..._017f4bac57a040c496e0c9d068dcfd9e._comment | 41 + ...hat_happened_to_the_walkthrough__63__.mdwn | 1 + ..._70db0e3cfb1318e95671c23726e5541d._comment | 8 + ..._f9305dd19b9b5f35e66d915b8c30374b._comment | 7 + ..._34___on_an_existing_repository__63__.mdwn | 1 + ..._d844cfe5f9907a766e871b64d68966c2._comment | 8 + ...o___34__git_annex_mv__34___file__63__.mdwn | 1 + ..._02d305f307b4d2ff7acd98cb36508a2f._comment | 10 + ...r__34___and___34__remote_server__34__.mdwn | 3 + ..._68734a118b7dc0c88ba67eca20953a55._comment | 10 + ...an_encrypted_ssh_remote_is_left__63__.mdwn | 1 + ..._67ee446ca6d66e2c259ea771c2c9a2b2._comment | 12 + ..._6d3cce3c8048e4aea8f0ed76473f6af1._comment | 8 + ..._bd506e1ca7307660b3b9769eb97beddb._comment | 8 + doc/forum/Where_is_the_content__63__.mdwn | 8 + ..._812e1cf740cbfa449ab3ef4dd5f2df08._comment | 132 + ..._5e2cfdfab6c4f84fe7a19447b417b5a7._comment | 8 + ..._bd4cbc8f256a94ffde4f57d2c406a9ec._comment | 16 + ..._a36b35d47472b5db779b0489bf3d4893._comment | 10 + ..._cloud_providers_are_supported__63___.mdwn | 3 + ..._1f9398840144e0452a2fed9336046547._comment | 10 + ...be_enabled_for_removable_drives__63__.mdwn | 7 + ..._4341898d5ae4f09a5b06d24f5fe6192d._comment | 8 + ...up_remote_use___126____47__.bup__63__.mdwn | 5 + ..._da9c7c0e93aefc2da7409de5b138d86f._comment | 8 + ...Will_git-annex_solve_my_problem__63__.mdwn | 7 + ..._35acbdd1a7727df204d776c2e8f02b53._comment | 8 + ..._230256c19ac139dea207d89c06f70782._comment | 8 + ...x_work_on_a_FAT32_formatted_key__63__.mdwn | 3 + ..._426482e6eb3a27687a48f24f6ef2332f._comment | 8 + ..._af4f8b52526d8bea2904c95406fd2796._comment | 8 + doc/forum/Windows_S3_host_issue.mdwn | 11 + ..._8c0a1e84713a04a25fdc1f74919d34aa._comment | 10 + ..._06ecc76797c430b27a2e24776761d043._comment | 8 + ..._1715557daa15b9e9e17b4850141e62af._comment | 10 + doc/forum/Windows_support.mdwn | 6 + ..._23fa9aa3b00940a1c1b3876c35eef019._comment | 9 + doc/forum/Windows_usage_instructions.mdwn | 25 + ..._d43dbd9406da3b9747b147715eca94ac._comment | 8 + .../Wishlist:_Bittorrent-like_transfers.mdwn | 5 + ..._13544d54fb0418af4ca9200cdb045d91._comment | 15 + ..._9a7dad35bf80c684ad97892420d7370c._comment | 16 + ..._e5de748bc5da12a4a01e08cde2407dd1._comment | 14 + ..._e51530178f1e034c0fdd5c9aa9945567._comment | 8 + ..._81ea9c129d8c02097f09ef8c68f1bb11._comment | 27 + ..._3b5798414f89686526da3dfa72c0c4f2._comment | 10 + ...hlist:_Don__39__t_make_files_readonly.mdwn | 3 + ..._7148527961e2d27793810966588c8d35._comment | 10 + ...s_without_copying_the_file_data__63__.mdwn | 6 + ..._1cf4ab29dfa2cff59b86305fc0018251._comment | 10 + ..._f5ebb7f43dcef861ecc13373fb1e263f._comment | 15 + ...cting_files_based_on_meta-information.mdwn | 15 + ..._818f38aa988177d3a9415055e084f0fb._comment | 15 + ..._97e2ed48bd552d02918c4f98f963e6e1._comment | 9 + doc/forum/Wishlist:_automatic_reinject.mdwn | 14 + ...g_the_disk_used_by_a_subtree_of_files.mdwn | 10 + ..._7abb1155081a23ce4829ee69b2064541._comment | 9 + ..._b4c6ebada7526263e04c70eac312fda9._comment | 18 + ..._ded71b270b94617a8ebb3a713d46a274._comment | 19 + ..._daemon___40__for_the_assistant__41__.mdwn | 1 + ..._42aa2b61b880f4048d874210212aa63b._comment | 8 + ..._3e201039fa0e611554171ee30e69a414._comment | 8 + ..._d1074724c44f3296cb438b2d526d8728._comment | 8 + doc/forum/Wishlist:_mark_remotes_offline.mdwn | 12 + ..._9e3901f0123abb66034cce95cc5a941a._comment | 14 + ..._d10e3d90cf421ae425e64ab266ea811b._comment | 12 + ...ptions_for_syncing_meta-data_and_data.mdwn | 13 + ...ecial_characters_if_filesystem_is_FAT.mdwn | 5 + ..._5d33bcbd862537f53edd91dcff2b8977._comment | 13 + doc/forum/Workflow_for_adding_files.mdwn | 32 + ..._a60dae97db827bc641d6256d1f382b5f._comment | 8 + ..._28dd15ac50f79fb07bacf8b8326c7edc._comment | 19 + .../XBMC__44___NFS___38___git-annex_.mdwn | 27 + ..._86480f31d410e903766f82e6ecf83e1c._comment | 12 + ..._d8ed4dd51d3050db691a8abdec24cd42._comment | 10 + ..._42b80ee51ce25775bf4532f53a8ecfe3._comment | 11 + ..._01767f3f864954cf8080274e206da9d4._comment | 8 + doc/forum/XMPP_authentication_failure.mdwn | 15 + ..._19c7c3aa79d209d613d2e061e3129690._comment | 8 + ..._870059fed451e8377e5d382464ecc34b._comment | 8 + ..._1a7ff955e9173f13d10b75f203792384._comment | 10 + ..._d59031ebc0dd3abc1f4c96878328362c._comment | 8 + ..._c37ef477bef7efdb79dd05dce90dfde6._comment | 10 + ..._48cabea4c2caf5b3bd854df3aaa17d3d._comment | 8 + ..._14cd9b67806db93c3af055d88c9a910a._comment | 10 + ..._151d3fd7d3cceb30fd20a8f3bd54036c._comment | 24 + ..._fbb9eba65fbb72201f08511945fbcf8c._comment | 9 + ...provide_some_kind_of_debug_data__63__.mdwn | 9 + ..._1ba0735141fc6a21ac15913f4cacefae._comment | 8 + ..._16994dc86b87592fc62799e2d206d172._comment | 10 + ..._6afd424edc4095b8f71b136de2a9e64d._comment | 10 + ..._1381b6a927410642c6a93aa8354be791._comment | 17 + ..._c5b33c7a8aa8e6d0f9349510dac2366d._comment | 12 + ..._9913d2983ba2744ed24911f74988e4c7._comment | 11 + ..._ad6f385a2b95803eb9d81dfe76359551._comment | 10 + ...tch_queries_to_the_location_log__63__.mdwn | 45 + ..._01cbfc513c790faef3a3ede5315d3589._comment | 10 + ..._fe28dfb360caa12d5d5bc186def3eb45._comment | 35 + ..._9bb30ab62febe4ef63bed49f831a473a._comment | 8 + ..._7832f0347a41b8204538c01b72487803._comment | 19 + ...71__Locking__187___files_until_synced.mdwn | 7 + ..._8bf59f47fee0a8d5741fe209b5899863._comment | 8 + ..._0c683547a6178e4303f0b1ed1f5605a5._comment | 8 + ...Pairing__34___more_than_two_computers.mdwn | 11 + ..._80f7a4bb3c66b11e566043407b611bbf._comment | 10 + ...34__Preseeding__34___a_special_remote.mdwn | 5 + ..._b0c46d0eba900d0f6169a2c698d7a222._comment | 12 + ..._5e63f5e6f45c11cc86b293ce8acad77f._comment | 65 + ...du__34___equivalent_on_an_annex__63__.mdwn | 5 + ..._a41bd02361aa961e5285aeaf1ea062be._comment | 10 + ..._28ba62a546f5cc8f416491423d743d8a._comment | 10 + ..._8d97f40c1d14b7230f3656a00a99cf80._comment | 8 + ..._baa8fbbdd5c449a0dc2bb622cb4a47ce._comment | 18 + ..._2ee6cbbfe54a2e7b6e8eb539c18e663d._comment | 10 + ..._48f6a2761a34b7f991325f1d24e2c5ff._comment | 8 + ..._d632baff41b8582f1a79bc5018c68545._comment | 8 + ...__39__t_send_it_to_working_directory..mdwn | 11 + ..._0c0a5999a92bf5880f2113177dc67cc2._comment | 11 + ..._c18083d9054f66f0bd51d63452af07eb._comment | 8 + ...nex_lock__34___very_slow_for_big_repo.mdwn | 7 + ..._044f1c5e5f7a939315c28087495a8ba8._comment | 16 + ..._e854b93415d5ab80eda8e3be3b145ec2._comment | 13 + ..._95c110500bc54013bc1969c1a9c8f842._comment | 8 + ..._a4fd212cb066cd53d0d66eb09f3b39a8._comment | 18 + ...I_would_like_to_have_file_x_y_z__34__.mdwn | 5 + ..._bfeb1446dee4d2f52ef25fabfb8cc8f6._comment | 11 + ..._e60f2bbc1c058993472fd920edbc75fc._comment | 8 + ...n_denied__34___in_fsck_on_shared_repo.mdwn | 17 + ..._3a5202ef2116ebb5559b6f4d920755fc._comment | 10 + ..._86663eeb75b0477f53c45f26c8e4b051._comment | 8 + ..._c336b2b07cd006d378e5be9639ff17ec._comment | 10 + ..._1339cd27ca2955f30b01ecf4da7d6fe8._comment | 10 + ..._refs__47__heads__47__git-annex__34__.mdwn | 34 + ..._e50188896df347f1d92e20a52053aa14._comment | 10 + ..._d67793f7c969f64943d1fd54a1208c2b._comment | 15 + ..._3523884833b5fd458a35f898797bf897._comment | 10 + ..._02c32c2521ba1a1eaa19eaca7281f2a6._comment | 10 + ....3.2_requires_syb___61____61__0.1.0.2.mdwn | 16 + ..._fae6e88115d175239fc55cef4c33fb2c._comment | 13 + ..._4c7a75638e8717132ccde949018d6008._comment | 10 + ...nual_ssh_remote_setup_with_shared_key.mdwn | 19 + ..._811cab17410ba6e07ae7af3249cd98df._comment | 14 + ...unce__93___metadata_extration_utility.mdwn | 30 + .../_preferred_content:_lastpresent.mdwn | 1 + ..._7610cd866b256d36646b642eb5f8cae5._comment | 14 + ..._d25666a173b78213d583f029fd166d06._comment | 10 + .../advantages_of_SHA__42___over_WORM.mdwn | 5 + ..._96c354cac4b5ce5cf6664943bc84db1d._comment | 8 + .../alternativeto.net___34__Like__34__.mdwn | 3 + doc/forum/android_binary-only_download.mdwn | 9 + ..._aab206e0bf0bb5ff47c7cc9795f12f92._comment | 8 + ...y_for_web_remote_with_SHA256E_backend.mdwn | 12 + ..._d1605a6e3b4d6863f4089218994ce564._comment | 29 + ..._d249ff27fa3d9ac3ca32485cdef49930._comment | 8 + doc/forum/archaeology_of_deleted_files.mdwn | 36 + ..._48f27df03ec18d2c27cf6b70dcf71dc5._comment | 10 + ..._c698cd10c8038bac45bd1049506a27c3._comment | 8 + doc/forum/archival_and_multiple_users.mdwn | 8 + ..._fc4ee256f03a7c189d687caf4a34e21e._comment | 9 + ..._a96d57d4bb567ac9b0b9167d5b1be011._comment | 12 + ..._bd44634b04732ffb91154c61ef9cf828._comment | 14 + ..._b89a56a5f1cd641f87925c7a5f74bcec._comment | 13 + ..._81293bf5dc8ad4552712c2083fd589c9._comment | 19 + ...ne_-_how_do_these_play_together__63__.mdwn | 10 + ..._d90d1d599ce557af03c6f0f2ea188212._comment | 10 + ..._58b1af497cab132acb28cb5f9283ec2a._comment | 8 + ..._37d4fd8f69e8066b5aa19454b714e443._comment | 11 + ..._a974e2105774d4f82ad286ff0792ba84._comment | 10 + ...d__backup_remote:_Howto_restore__63__.mdwn | 38 + ..._70200f871b9df49261f32752a6bb0e67._comment | 14 + ..._173da510b45f0320ae8aa2df9f14ae7b._comment | 11 + ..._1ecea12a4be5ad09013cddb62df6ab20._comment | 8 + ..._af4bc222d1479482bd83952353c97f05._comment | 8 + ...zealously_moving_stuff_to_other_repos.mdwn | 5 + ..._6bd240edf1868615024ff11c24c3d52c._comment | 13 + ..._37c5e9a7669b5b94fbadb8792a765316._comment | 8 + ..._87aa4c5942929be81ddc1e2795d56f0e._comment | 9 + doc/forum/assistant_without_watch__63__.mdwn | 13 + ..._be1f7c038426e53209a85ae1119269d5._comment | 15 + ...e_server___40__needs_ssh_tunnel__41__.mdwn | 10 + ..._817a3ed424e4fb76fcd33295f2953250._comment | 8 + ...ders_for_git-annex_to_aid_development.mdwn | 34 + ..._7e88f815e8d9652ef18ea6d54b118962._comment | 8 + ..._fef17a10226af5671495c2929653c337._comment | 8 + ...ing_existing_backups_into_new_remotes.mdwn | 3 + ...nstorming:_git_annex_push___38___pull.mdwn | 28 + ..._3a0bf74b51586354b7a91f8b43472376._comment | 11 + ..._b02ca09914e788393c01196686f95831._comment | 14 + doc/forum/bash_completion.mdwn | 1 + ..._5c42c0c8e7fc3224bf5406880f9fd0c4._comment | 8 + ..._6cbe3c825db99bf9188a0de8bb937d5b._comment | 8 + ..._948c40f1e46ca220d61365aebcd4f6d7._comment | 136 + ..._dbae348b230b780cda91ed8576b8f9fa._comment | 8 + ...batch_check_on_remote_when_using_copy.mdwn | 34 + .../benefit_of_splitting_a_repository.mdwn | 10 + ..._93a86cb03b66e7ab5dd7146e7b86c9e8._comment | 15 + ..._4e2fed247298d620fee7be883a1e86a6._comment | 15 + ..._practices_for_importing_photos__63__.mdwn | 13 + ..._37f0ae4b552ec2a4a144ddcdc17c8453._comment | 19 + ..._7f96f0fe0fc073321bd7c5bbd9048425._comment | 11 + doc/forum/btsync_equivalent__63__.mdwn | 8 + ..._6bfdc6f595a8aa8979a7c2a10925812f._comment | 8 + doc/forum/cabal_install_fails_on_uuid.mdwn | 23 + ..._2a3963e21bc7ff526124b902cb0b6ad2._comment | 8 + ..._1609525998e2b36c04d67f4d988139c0._comment | 10 + .../can_I_only_add_my_own_files__63__.mdwn | 27 + ..._767d647af9d0345f337338d6319071fa._comment | 10 + ..._0c3306ffb38b97b54e1e0436d12c1876._comment | 8 + .../can_git-annex_replace_ddm__63__.mdwn | 13 + ..._aa05008dfe800474ff76678a400099e1._comment | 12 + ..._008554306dd082d7f543baf283510e92._comment | 19 + ..._4c69097fe2ee81359655e59a03a9bb8d._comment | 12 + ...ncrypted__41___rsync_remote_on_MacOSX.mdwn | 18 + ..._21f0101447623f5a0cf9e72c3ff463bb._comment | 8 + ..._6234ca64bd03a0e15efbe8f5c204338a._comment | 8 + ..._5ac2b520a907e232984eb513ce088054._comment | 8 + ..._183dd1c29f66539193e7c0b73f329430._comment | 9 + ..._c920d04ffe332caed9d223fa0ac42746._comment | 7 + ..._7a3cf0853a8ec7b996e19b5e80145d21._comment | 8 + doc/forum/central_non-bare_and_git_push.mdwn | 9 + ..._76d0c73c8985e860eb86333c63be6340._comment | 8 + doc/forum/clear_box.com_repository.mdwn | 1 + ..._2e839d8f974269c80a9fca183712350f._comment | 8 + ..._8f9c7248a148a24ae2aba39c4a79a6d1._comment | 8 + ..._f64ad21e5abfbf4e1f925b3d651bdba3._comment | 10 + ..._f8c06ac9b23b51cf18d362c260fc47a9._comment | 13 + ..._61d401b29322802cb25896503f3e6514._comment | 8 + doc/forum/cloud_services_to_support.mdwn | 16 + doc/forum/cloudcmd.mdwn | 6 + ..._current_workdir_state_in_direct_mode.mdwn | 5 + ..._748481ff00374f570284bd4571584874._comment | 10 + ...itory_vs._working_copy_in_direct_mode.mdwn | 10 + doc/forum/confused_about_external_drives.mdwn | 30 + ..._8340e5ff17a4846b41789e4966fed70c._comment | 12 + ..._ad10bd0ec14c16bcad089b3ebe64580e._comment | 10 + .../confusion_with_remotes__44___map.mdwn | 113 + ..._a38ded23b7f288292a843abcb1a56f38._comment | 10 + ..._cd1c98b1276444e859a22c3dbd6f2a79._comment | 8 + ..._18531754089c991b6caefc57a5c17fe9._comment | 24 + ..._3b89b6d1518267fcbc050c9de038b9ca._comment | 11 + ..._27801584325d259fa490f67273f2ff71._comment | 16 + ..._496b0d9b86869bbac3a1356d53a3dda4._comment | 8 + ..._9a456f61f956a3d5e81e723d5a90794c._comment | 27 + ...t_way_to_add_two_preexisting_datasets.mdwn | 25 + ..._c5c3ff25c9f5e34db222b5f4ae58b093._comment | 10 + ..._ee3ecc86990ac5a8d0c4fdfb482a7594._comment | 16 + ..._e29bf8b848da04c761dc601ac979ac14._comment | 11 + ...could_not_read_from_remote_repository.mdwn | 36 + ..._27d4d1556a80c06505ed3d8a9422d082._comment | 8 + ..._cf7d5e231675921c3d98faab3613c92f._comment | 49 + .../differenc_in_webapp_icons__63__.mdwn | 4 + ..._c38e2692b13a1b76777bf88312a03966._comment | 8 + ...not_use_git-annex_inside_your_Dropbox.mdwn | 5 + ..._5a1dc9da6e6861829e321446ec7991ee._comment | 8 + doc/forum/dot_git_slash_annex_slash_tmp.mdwn | 5 + ..._14b74438bb1e3e02cff7926d774ba09a._comment | 8 + ..._b1f717342c1c8ea42a451caa2d936622._comment | 8 + ..._e2c6ad99333018c8c46e736da416b8ef._comment | 8 + ..._35ae9d6bcb8d9762a92e3564b686ed72._comment | 8 + ..._92b1e8956513dbf52da31cec3f58e2c5._comment | 104 + ..._839e29d41de9dcc8f01dfdc585a51d12._comment | 12 + ..._1a35ef8cb89e0cd392f6e9fcee1fb92c._comment | 8 + ..._f4cc36c493d7c20fbaf949edd38e1252._comment | 15 + ..._69268f8aa29e807a56248f1fac86aa41._comment | 10 + ..._0ffb0c803c232a1587f956f16113aeb7._comment | 27 + ..._c303e28825241733d69fca74f2015fc6._comment | 13 + ..._3f0b376e37bd092b8d46c46bb1940e35._comment | 14 + ..._615641b3dd176d4b3a5bbfb521098e38._comment | 9 + ..._4600fa9234a787004ea0e0dbb36184b9._comment | 8 + ..._4f5cd0d0d4db0479c1ad86ffdc5ae434._comment | 8 + doc/forum/downloading_from_moodle.mdwn | 76 + ..._3f677130d268de4288e87cfa86ea055c._comment | 10 + ..._dcef60ec144f123dadd165fb602ab950._comment | 8 + ..._d3efb767bf9b20f96242dcf64817bd4b._comment | 8 + doc/forum/drop_old_versions_of_a_file.mdwn | 3 + ..._799a413248fb8f98efbf226b1bc4300d._comment | 8 + ...0__user_error__41__._How_to_fix__63__.mdwn | 24 + ..._bb6d749b758b17178227929bf7327fe1._comment | 8 + ..._d834df30633f7d5569797ee818cf38c3._comment | 20 + ..._1e02eff33c9fa7bea03aa6d58b910175._comment | 14 + doc/forum/empty_directory_handling.mdwn | 3 + ..._34ac97b9337b6230ed8a4748203fe543._comment | 8 + ..._73a39e28d5a09ac342cb4195d263d91e._comment | 8 + doc/forum/endless_password_prompt_loop.mdwn | 8 + ..._cceba12ed25cd671c7cee5a28631163e._comment | 10 + ..._f0cb86b45eb289f35197c43f83660a8f._comment | 8 + ...oes_not_point_to_a_valid_object__33__.mdwn | 17 + ..._d370b044da3bfebf9e4c90ce1e243587._comment | 18 + ...error_in_installation_of_base-4.5.0.0.mdwn | 14 + ..._0b2f79c014e0dd9badd52b8b6aa47e0c._comment | 19 + ..._3badd64e48fbb174cd7de1ac9589bedf._comment | 31 + ..._d8190061ac1c683a7b699cf42e9db694._comment | 8 + ..._49a4fcd2dc4f97d4055b5051feea5e3b._comment | 8 + ...e_of_massively_disconnected_operation.mdwn | 33 + doc/forum/exclude_files_from_annex.mdwn | 10 + ..._82e7de5e631bae3b347815586274a936._comment | 25 + ..._03d4599fdceb3dff184eed82824674bc._comment | 12 + ...xpire_files__44___move_to_other_hosts.mdwn | 19 + ..._ddcc2a00be1ae96a352d75a443458bcf._comment | 14 + ..._7a4c3858c5eae409d04de3f9da43b57e._comment | 17 + doc/forum/exporting_annexed_files.mdwn | 4 + ..._e08e4c79588e17fb2f1cdf53d9fab7ea._comment | 16 + ..._15dc3024417b5b2ff3544a08beacab34._comment | 8 + ..._86f0e0f767a84a0f583e121d36cb7d48._comment | 8 + ...oes_not_exist__40__v_3.20111231__41__.mdwn | 26 + ..._990197bf01351dc1ccbe1940d5084adb._comment | 7 + ..._3bb1d21b7f0d0bd6d59190ae9d246d46._comment | 12 + ..._692f268218690437138ae0540c879425._comment | 16 + doc/forum/faking_location_information.mdwn | 19 + ...map_failed:_No_such_file_or_directory.mdwn | 112 + ..._d98a155fa01d10ecff9058d79290156d._comment | 13 + ..._3b9ea7a1254ac5b50a5ab59cd331ec3f._comment | 8 + ..._5ee300034819c5825c676cd7e3af659f._comment | 12 + ..._cf7f5c91d3c15f72d2a714b7362c1197._comment | 30 + doc/forum/first-time_setup_git-annex.mdwn | 7 + ..._a58d83ee3a7c2251d9a775847223f8ca._comment | 13 + .../flickrannex_--_not_sure_I_get_it.mdwn | 7 + ..._57ea9f26760f970a70f09934d31a79b5._comment | 8 + ..._ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment | 8 + ..._74f143965f48c89a3583acf1b6a7635a._comment | 9 + ..._493bb86dedfa91ccc0c9be4045953ee4._comment | 8 + ..._2c410aa478b21c0e6eb0e4d54bc8c362._comment | 8 + doc/forum/folder_size_question.mdwn | 3 + ..._782cbf836335d86ff29853c34f00fec3._comment | 12 + ..._391aa62e4d8c496a58be4707522d8edb._comment | 22 + ..._1e850dbe36fafe0505b60dd2ce0bd5d7._comment | 8 + ..._907f3b1cfe745abf94a6a8ba0dbd4396._comment | 25 + doc/forum/fsck_gives_false_positives.mdwn | 6 + ..._b91070218b9d5fb687eeee1f244237ad._comment | 15 + ..._f51c53f3f6e6ee1ad463992657db5828._comment | 10 + ..._692d6d4cd2f75a497e7d314041a768d2._comment | 10 + ..._7ceb395bf8a2e6a041ccd8de63b1b6eb._comment | 10 + ..._86484a504c3bbcecd5876982b9c95688._comment | 13 + ..._1d4fbbd212fa92967abda346323031f4._comment | 8 + doc/forum/gadu_-_git-annex_disk_usage.mdwn | 7 + ..._f632a62c4dbbf01b29f146893d7725f9._comment | 15 + ..._73461da2d55d040cb43e0db286975821._comment | 21 + ..._6c4fb123091bde435c18ac3dfd5a9b77._comment | 8 + ..._067d0ffe8900751bd2d2743254ac4d77._comment | 11 + ..._ec8b57426e4d82c3392eb7dd683f2ddc._comment | 17 + ..._38296fef5a2dc5794c2dc09df676b8c1._comment | 18 + ..._1bcc94f9982c6cfd0888f3dba0f9221e._comment | 8 + ..._4365cd3031456fac1b563ee72984638e._comment | 18 + ..._2b03d7b857497cb811e992f85700cdcc._comment | 12 + ..._03a4dfaf3bd73d41c6f3c3fab0a6a922._comment | 8 + ..._fc6ddb4dc075ee42368863c1b026dbf7._comment | 13 + ..._f03254e518cbdda73e4b88e72476275d._comment | 8 + .../get_and_copy_with_bare_repositories.mdwn | 7 + ..._a6e4628c0770e3f5e81348a6f29dd845._comment | 10 + ..._652fa1bae5c2bb63dcffcbda97a567c4._comment | 8 + ..._annex_to_do_a_force_copy_to_a_remote.mdwn | 11 + ..._3deb2c31cad37a49896f00d600253ee3._comment | 14 + ..._627f54d158d3ca4b72e45b4da70ff5cd._comment | 12 + ..._3f49dab11aae5df0c4eb5e4b8d741379._comment | 8 + doc/forum/ghost_semitrusted_repositories.mdwn | 28 + ..._99bea1a964da9c5603b8cfbdc19bcde8._comment | 19 + ..._fe5fe5539d06c6b1ef69f3ed805f1ab4._comment | 8 + ..._588325ef52c80cfc67d1dd80a9d5bd13._comment | 8 + ...t-annes_assistant_+_MAC_OSX_questions.mdwn | 16 + ..._e661f31acd08a6459842f7f95e5c062b._comment | 9 + ..._e71a9d1fcf1f945fec0b7834b6038e91._comment | 21 + ..._372d9da8295d093b8b316f0a48b60ee1._comment | 12 + ..._573537a49e082515bfb1be84c91b5d1b._comment | 10 + doc/forum/git-annex:_map:_1_failed.mdwn | 12 + ..._35ff3256e823ab8cfc53276a2123ad5f._comment | 8 + ..._b0826073ebbd2847f4ab0d9bdba2dce5._comment | 14 + .../git-annex___38___ikiwiki_experiment.mdwn | 28 + ..._9f74449ec91577dbf6095f4beafac293._comment | 10 + ..._e034585c8b51cc30b35c1f7ae68205bf._comment | 14 + ..._fbbd47c3dbe8de24b0df664e4afd5cb8._comment | 14 + ..._55da5c3c41c13b08590ce1ff8117cef6._comment | 23 + ..._f67823351164ddfe7d595685c3679652._comment | 10 + ..._d5cc91164772849d027fed5f962d9000._comment | 10 + ..._cb4ec7ed3c39d0649133191a85ea6ab3._comment | 17 + ..._86565e5e1508ff1862f88975446650a2._comment | 12 + .../git-annex_across_two_filesystems.mdwn | 30 + ..._53167648b8b70b41d19ca662a5f3687e._comment | 26 + ..._39adeebc1af9c437f1fc2e00c07509bf._comment | 11 + ..._f4e3f28db005301adeef7ccd2c9998fb._comment | 18 + ..._53fa7ac6f80e3281768a7bfd3d438b34._comment | 10 + ..._2e1be54c01970ef3456e8af4aaf00cbf._comment | 10 + doc/forum/git-annex_and_tagfs.mdwn | 14 + ..._887c74cb61d30198322ef74ebc80f950._comment | 8 + ...ex_assistant_with_2_dedicated_servers.mdwn | 11 + ..._533ade2215c879cd46782fd66a97b167._comment | 16 + ..._c9ae51d7b772cf7a91d90925f74d2b60._comment | 10 + ..._41fbee0ec9bc890e309bcd48a58c3851._comment | 18 + ..._571cffc0beb8ba5fc936db6971cd3d62._comment | 8 + ..._0fb62af673a4bc8183e8fef048ceedd4._comment | 10 + ..._53a79af2d8e3abe50b983bf91972b8f2._comment | 14 + ..._c0ba3e8b7fbf8a5ed718001cec8df676._comment | 35 + ..._60c39bc8ef74e80e72381d514b6dd223._comment | 8 + ..._6241120b4325c905661ef72881f4d7af._comment | 20 + ..._cab00b8fa195340f4d3fdaf5af975b57._comment | 8 + ..._e24df9a1c68724a912b8ac6533d9bd25._comment | 16 + ..._ace3dc7c60c710a04b0a587206b341c4._comment | 8 + ..._9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment | 14 + ..._ea88e0696f6e25e6904248a323f6cc36._comment | 8 + ...Meego_Harmattan__41___and_Sailfish_OS.mdwn | 7 + ..._301a51c48c3d54f9d37feace26a772f8._comment | 8 + .../git-annex_communication_channels.mdwn | 10 + ..._198325d2e9337c90f026396de89eec0e._comment | 17 + ..._c7aeefa6ef9a2e75d8667b479ade1b7f._comment | 8 + ..._1ff08a3e0e63fa0e560cbc9602245caa._comment | 8 + ..._1ba6ddf54843c17c7d19a9996f2ab712._comment | 8 + ..._404b723a681eb93fee015cea8024b6bc._comment | 8 + ..._0d87d0e26461494b1d7f8a701a924729._comment | 8 + ..._2c87c7a0648fe87c2bf6b4391f1cc468._comment | 10 + doc/forum/git-annex_on_OSX.mdwn | 1 + doc/forum/git-annex_on_Samba_share.mdwn | 9 + ..._3e9cfdf2c088e48c967ad08f79966742._comment | 12 + ..._9d3df393b7b727653598453d94dd33db._comment | 12 + ...on_Ubuntu_13.04_and_13.10_not_working.mdwn | 12 + ..._209956f3812450a43986d4ca5e647da6._comment | 10 + ..._12a58b8efe545e09b64760c87849839b._comment | 12 + ..._e0f7328603256f25c3be3706ecc9c76c._comment | 12 + ..._6bb8e4522241556fb82784d9b834cbfe._comment | 10 + ..._89a5296b461d400b51006074a13a4560._comment | 8 + ..._62daef4b4392c951b914a01b3effac11._comment | 8 + ...git-annex_on_archlinuxarm__44___armv6.mdwn | 20 + ..._88fa644df8614c2db0d092b3eb1d3156._comment | 10 + ..._b25ca7520ff7e339ec887a379d5100ee._comment | 10 + ..._eda0e90c1285396b1ab20ecc04ea6e29._comment | 8 + ...loses__47__doesn__39__t_run_on_launch.mdwn | 7 + ..._a47174f8438bfaa42fb8067bca77bf4c._comment | 8 + ..._567bb460cec7cd2135386acf4e7dceb4._comment | 8 + ...nex_pre-commit_eats_all_my_4GB_of_ram.mdwn | 24 + ..._ff16c7932b60b85c744bafc48bb040e4._comment | 13 + ..._5599cddf579d18f70cab6e48d04ae99d._comment | 12 + ..._412941e9385f63153b23695641e71deb._comment | 15 + ..._112ad140d9006c530db2121bec24de30._comment | 10 + ..._9178023b95683a649355f291165a1467._comment | 8 + ..._9251203421c1c3c3aed7828c4b97ecb8._comment | 17 + ...nt_available_from_which_version__63__.mdwn | 12 + ..._104e1b7e7643844f221f85dcbe9c9c4b._comment | 8 + doc/forum/git-annex_teams___47___groups.mdwn | 5 + ..._0450673ab74f184a47ac7bab568d26dc._comment | 8 + ...nex_unused_not_dropping_deleted_files.mdwn | 34 + ..._2152cfb09675e46e7492e198dd3ea094._comment | 8 + ..._97e666dbac9de2a5e688921cba8a42e9._comment | 20 + ..._d7b0e9515bface28f3650b8aa20ec2f4._comment | 8 + ..._5816f6cab42e27e724e735368f693b09._comment | 8 + ..._8e97f39225515f0bf8b168dfd6a0efab._comment | 10 + ..._bef37f8ec9c337387b79ffd6d56fe425._comment | 10 + doc/forum/git-assistant_clarification.mdwn | 11 + ..._8f553e59da12f798b854a457b96b5778._comment | 14 + ..._06cf62b599edea6ad8396776f0081494._comment | 10 + ..._36f0bd6e7a824e6ef40a309850bb087b._comment | 15 + doc/forum/git-remote-gcrypt.mdwn | 1 + ..._175c8c35d9bbb470fcc17697eb8cc6b8._comment | 12 + ..._fdcaf507e14c995636dd93a41e488df3._comment | 8 + ..._f4e830f961dbe1c60ddd277b9d888133._comment | 8 + .../git-status_typechange_in_direct_mode.mdwn | 48 + ..._12c8b67aadbfa2b073e12997a55d49a7._comment | 12 + ..._005d1b17f3c2ae192aa30c6e5163989e._comment | 8 + doc/forum/git-subtree_support__63__.mdwn | 9 + ..._4f333cb71ed1ff259bbfd86704806aa6._comment | 10 + ..._73d2a015b1ac79ec99e071a8b1e29034._comment | 8 + ..._c533400e22c306c033fcd56e64761b0b._comment | 8 + ..._75b0e072e668aa46ff0a8d62a6620306._comment | 8 + ..._f5ec9649d9f1dc122e715de5533bc674._comment | 8 + ..._85df530f7b6d76b74ac8017c6034f95e._comment | 8 + ...nex_add_crash_and_subsequent_recovery.mdwn | 25 + ..._062d0153a379c1ba1df8585b90220d3d._comment | 18 + ..._6fc6be43c488c468a4811cd0a1360225._comment | 19 + ..._45efaaf27d9b580c4c75cbcdc4f65b64._comment | 10 + ..._c560eae40867512b0af2cbef161fc8ac._comment | 8 + doc/forum/git_annex_alternative.mdwn | 10 + ...ant_-_Changing_repository_information.mdwn | 1 + ..._cde71a410200a7478180748fdcde0352._comment | 8 + ...istant__44___share_with_other_devices.mdwn | 3 + ...-to_blah_much_slower_than_--from_blah.mdwn | 15 + ..._5b6e0b749b01a97a6b52a2c1cca6e35a._comment | 12 + ..._8f2567f4c4f6db2078211a87689757d3._comment | 17 + ..._ab98121076b88f351fc8cd9197e6bf64._comment | 8 + ..._cb13328add1b7a812efd817ad3dd1a4f._comment | 8 + ...e_about_why_some_files_are_not_copied.mdwn | 59 + ..._75445fc0e01ee99bae1c1f5a60e314bc._comment | 12 + ...glish_filenames.__Rsync_problem__63__.mdwn | 22 + ..._292ee7c8b37cbd13f03eb67d0359b99e._comment | 10 + ..._f6341119fcfde5d8160c8f603b1a6fea._comment | 10 + ..._8ad3a1d1fe5995d61e5e137280bc76c3._comment | 8 + ..._86b61b0484f3f4ecff657e46333b3d4f._comment | 8 + ..._5ffac00d08d26acaba8c3513b24c4d65._comment | 10 + ...nnex_get_--want-get_another__95__repo.mdwn | 68 + ..._0be0b3981ddd0743ff26cf6d396e521d._comment | 16 + ..._b1ead1085a87818625579bf1ef151b5d._comment | 8 + ..._cf2018852c84b0bf1ac061def6f0ac5d._comment | 27 + ..._22562e8f1f2f91b9f9a5939ec9006cb5._comment | 38 + .../git_annex_get_creates_a_new_uuid.mdwn | 6 + ..._004c87183968c326058bd3159a5baa0b._comment | 14 + ...___47___metadata_in_git_annex_whereis.mdwn | 1 + ..._7fba10b85f4d9289c7782eccef46949e._comment | 8 + ..._7dcec124ea7d0291ed40d80e2ffd5c7e._comment | 8 + ...sx_only_creating_symlinks__63____63__.mdwn | 18 + ..._6889c4452e636474b4e70798b404fed2._comment | 10 + ..._978fc11c463a457382fddd668cd1d0dd._comment | 20 + ..._4420bd3afaecd7536b02fc08cee82dbe._comment | 8 + ..._99286f17a87049c303f2aa34c0a90286._comment | 13 + ..._39bad7441dcea4da4b389700301233de._comment | 8 + ...annex_sync_dies___40__sometimes__41__.mdwn | 22 + ..._48bbac0545bf13bbf04da723e418d037._comment | 14 + doc/forum/git_annex_test_on_windows.mdwn | 5 + ..._258ac5cfa2f5d24e737d94dc48f06899._comment | 10 + ...annex_with_local_apache_webdav_server.mdwn | 23 + ..._a3b89f90f9ac70e0a9b0711ede1cb810._comment | 12 + ..._d8e9237cf6e7f7558f836ba1352f5517._comment | 13 + doc/forum/git_pull_remote_git-annex.mdwn | 11 + ..._9c245db3518d8b889ecdf5115ad9e053._comment | 36 + ..._0f7f4a311b0ec1d89613e80847e69b42._comment | 14 + ..._1aa89725b5196e40a16edeeb5ccfa371._comment | 14 + ..._646f2077edcabc000a7d9cb75a93cf55._comment | 37 + ..._4f2a05ef6551806dd0ec65372f183ca4._comment | 10 + ..._3925d1aa56bce9380f712e238d63080f._comment | 8 + ..._24c45ee981b18bc78325c768242e635d._comment | 8 + ..._7e76ee9b6520cbffaf484c9299a63ad3._comment | 12 + doc/forum/git_tag_missing_for_3.20111011.mdwn | 1 + ..._7a53bf273f3078ab3351369ef2b5f2a6._comment | 8 + doc/forum/git_unannex_speed.mdwn | 1 + ..._10cf326248f4e89e1f75bf97d7574763._comment | 7 + ...ls_and_daily_free_retrieval_allowance.mdwn | 6 + doc/forum/handling_MP3_metadata_changes.mdwn | 12 + ..._aa4955fd64ea5aa836f1a591e185c4a2._comment | 8 + doc/forum/hashing_objects_directories.mdwn | 27 + ..._c55c56076be4f54251b0b7f79f28a607._comment | 12 + ..._504c96959c779176f991f4125ea22009._comment | 14 + ..._9134bde0a13aac0b6a4e5ebabd7f22e8._comment | 12 + ..._0de9170e429cbfea66f5afa8980d45ac._comment | 12 + ..._ef6cfd49d24c180c2d0a062e5bd3a0be._comment | 12 + ...ing_git-annex_on_top_of_existing_repo.mdwn | 12 + ..._4cb38d71c943657c5ba0896cd70d2e64._comment | 8 + ..._b5e94c10ebbed9125c7e2332f75709ca._comment | 13 + ..._2b3b93bbc60fbc24d436231954d6822a._comment | 10 + ..._2dfda33ffa39b92b16c8bd9005e1cefe._comment | 21 + ..._96b1eb1e8e9f315c646f4686870f9b52._comment | 10 + ..._e85c3fa1d17f1d6ec625b9c4f9b698c3._comment | 47 + ...manually_sync_my_external_drive__63__.mdwn | 9 + ..._4fd8722cafd55b0503c802289206645a._comment | 10 + ...e_from_encrypted_special_remote__63__.mdwn | 14 + ..._d4dc451892e7a6e230bf32adb7f3f9fa._comment | 8 + ..._79340bf3c0691073a9808c5ac2da0a3d._comment | 14 + ..._6302fb6e5bb7cbddf2cfe74d98d32897._comment | 12 + ..._e3d95bc09c9fb21e8e9bbacc642aa60f._comment | 8 + ..._f2f0a1c2fb0c6323707b11e2b06aa2db._comment | 8 + ..._66fe80e634a8f13cce18fe68974ec67a._comment | 8 + ...lly_running___96__git_add__96____63__.mdwn | 5 + ..._440dcd19ea2512f968858b780c2a2913._comment | 22 + ..._e9b70386774996a3d0446faaa3219120._comment | 8 + ..._3dbd76accad2df2fff14b55452c828ef._comment | 8 + ...nks_but_keep_historical_file_contents.mdwn | 7 + ..._cba76311e146dabb8ffc789bf4c8b714._comment | 14 + ..._8d99c50fc1347367ccc0714e8d1af385._comment | 40 + ..._a7a9c55c2ad448179dff5d5b69976c7d._comment | 10 + ...k_to_existing_direct_mode_git-annexes.mdwn | 5 + ..._7bd0edaf2352293678f0942aaa885d13._comment | 8 + doc/forum/howto_update_feed.mdwn | 14 + ..._bec356619f370a618f19a187d09d2e35._comment | 8 + ..._84dfb80ba3db8d41164eb97022becae3._comment | 8 + ..._20166db298c10074e062aecad59ffd71._comment | 20 + ..._f040e31b763fc9a7aa092442b4d6b8e8._comment | 20 + .../ignore_changes_made_by_a_remote.mdwn | 8 + ..._825676069d2e1554499b76fd8c306c30._comment | 10 + ..._dff49b72f7e072fddaf68584beb97f3c._comment | 10 + doc/forum/incompatible_versions__63__.mdwn | 1 + ..._629f28258746d413e452cbd42a1a43f4._comment | 8 + ...mmit_some_files_in_direct-mode___63__.mdwn | 5 + ..._804e43111ee97dff15e49e50b6c29d91._comment | 14 + ..._299ad6cd0225daa166d36af3726a9ef2._comment | 14 + doc/forum/known_and_local_annex_keys.mdwn | 14 + ..._3cb4828dc7116e4cf49e119f055ae9a3._comment | 20 + ..._68f20c881eafe986694bde10571cf1c0._comment | 10 + ..._e195a7091a06ce0427bb28aca9a17d04._comment | 8 + ..._d81f0bf7465832cb676fd89f5d53ec18._comment | 8 + doc/forum/linux_standalone_tarballs.mdwn | 1 + ..._5c3ceb845a45e50784f7098bfbf94df1._comment | 13 + doc/forum/local_pairing_with_2_mac.mdwn | 27 + ..._508585e72c81d197a9a1e193c25a702a._comment | 15 + ..._6ca4fed183340a2902d1d4d91284b772._comment | 8 + ..._7c2b3d0a8a69c7056508f8ec73ebefcd._comment | 13 + ..._07fa468aac1288e770487973052bccea._comment | 12 + ..._dc0494213d2b57b5b9a489b096a5b8d0._comment | 31 + ..._bcac18e137c00d4279774dec51963289._comment | 10 + ..._76b62eafda1ecbf88abe288cbe778e17._comment | 17 + ..._13fe788f2e9a823ad2e4844f114675a7._comment | 10 + ..._f81b454e9cfc14dcb33148798be55de3._comment | 16 + ..._f7a1ce9627ebfc854dfde2f6c924db80._comment | 8 + doc/forum/location_tracking_cleanup.mdwn | 24 + ..._7d6319e8c94dfe998af9cfcbf170efb2._comment | 10 + ..._e7395cb6e01f42da72adf71ea3ebcde4._comment | 15 + ..._c15428cec90e969284a5e690fb4b2fde._comment | 10 + doc/forum/lost_in_walkthrough....mdwn | 78 + ..._51b703b961ca762f0359e1c169f1ee75._comment | 8 + ..._a9de0401a103bdd4401ba2d5983dc54a._comment | 11 + doc/forum/luks_encrypted_disk_support.mdwn | 3 + ..._0ea476c778888f34196d9031f72b1844._comment | 10 + ..._0af149bfe1868dde0a132c5d835c50df._comment | 8 + ...use_of_my_shiny_new_rsync.net_account.mdwn | 20 + ..._0ebe509b768d46081db2100f5b712ef7._comment | 10 + ..._ef63d893531d93d2eb09f48f8baff4dd._comment | 13 + ...n_pages_in_the_prebuilt_linux_tarball.mdwn | 1 + ..._a7bc2e84e6d7c0e2de5900685207af78._comment | 9 + doc/forum/managing_multiple_repositories.mdwn | 3 + ...pdate_of_.git__47__annex__47__objects.mdwn | 8 + ..._ea6ec91150c8962e2711631f2422bf3a._comment | 10 + ..._a7bbf304b26650a786e358bdc01e3069._comment | 33 + ..._a855096b683c4c4f84e72c797e065d59._comment | 12 + doc/forum/many_remotes.mdwn | 24 + ..._existing_git_repository_to_git-annex.mdwn | 66 + ..._4181bf34c71e2e8845e6e5fb55d53381._comment | 10 + ..._5f08da5e21c0b3b5a8d1e4408c0d6405._comment | 60 + ..._f483038c006cf7dcccf1014fa771744f._comment | 12 + ..._057f0079fbee3451ccda08026bab21d4._comment | 20 + .../migration_to_git-annex_and_rsync.mdwn | 33 + doc/forum/misctmp_filling_up.mdwn | 11 + ..._2739dec72fe0950dd070c8fab9fbd751._comment | 10 + ..._440081b5e2b9b5b19e8cd5db3649a976._comment | 10 + ...__files__42___into_an_annex.__bummer..mdwn | 3 + ..._752db25abb647804a1cc12c5b247378a._comment | 10 + ..._db6f4959c35732f72e7a90bd9f4c665c._comment | 8 + .../multiple_repositories_single_backup.mdwn | 6 + ..._4a479fa78e0b366fcff1a27bc37081de._comment | 12 + ..._bbe19eec0969385a0d4682bf9e9de21a._comment | 11 + ..._1b18ea058e3eb34852055cffe51de176._comment | 8 + .../multiple_routes_to_same_repository.mdwn | 2 + ..._26c1734d41d5374f18fc688d862d6b8e._comment | 8 + ..._d119ab485fb2d5512c15372efdb2327d._comment | 8 + ...___40__for_tagging_photos__41____63__.mdwn | 11 + ..._96beb9ea895c80285748adb940b4f57d._comment | 9 + ..._985065c1feed9300631dac7a2701f669._comment | 8 + .../multiple_urls_for_the_same_UUID.mdwn | 26 + ..._de7410d8824a864c4d106c9f1afaec3f._comment | 8 + ..._309a86cf7e08448be64357a30d8b56ae._comment | 13 + ..._fa97a45fc1392935fd5e0714db999bc2._comment | 14 + ..._139178b1ba45b62eec0c89a660c0c81e._comment | 8 + doc/forum/new_linux_arm_tarball_build.mdwn | 12 + ..._5f9735ec62478c99b8c814055206cff0._comment | 12 + ..._859c44046b00fe885f6878cfe0e46360._comment | 10 + ..._35ade68d62e95036344ad33db3279c21._comment | 8 + ..._7211ddc626bae97d4140c723c3cf028f._comment | 8 + ..._fcbe3f7fa9d012b21c7a771553fa9142._comment | 8 + ..._2702cdbae4179a7a103d2a7098a8ed5e._comment | 34 + ..._e1d802fbcc9d699ece5267e80990255a._comment | 10 + ..._257b91ecbf5a6040a8e4c9a360c775ba._comment | 9 + ..._bd8cca86a63be7e330111618c1959a74._comment | 8 + ..._6814bdeca94328fe6c3f407795ff923a._comment | 10 + ..._6db99d998ca990494c8f2826ff1ca273._comment | 11 + ..._2802b24ccb24f1615c9d61904f916d05._comment | 12 + doc/forum/new_microfeatures.mdwn | 59 + ..._058bd517c6fffaf3446b1f5d5be63623._comment | 8 + ..._41ad904c68e89c85e1fc49c9e9106969._comment | 8 + ..._a1a9347b5bc517f2a89a8b292c3f8517._comment | 15 + ..._5a6786dc52382fff5cc42fdb05770196._comment | 18 + ..._3c627d275586ff499d928a8f8136babf._comment | 8 + ..._31ea08c008500560c0b96c6601bc6362._comment | 8 + ..._94045b9078b1fff877933b012d1b49e2._comment | 10 + .../nntp__47__usenet_special_remote.mdwn | 18 + ..._171a0b95b1f95cfd82073e88bdefaab9._comment | 10 + ..._48736ed17c98ffcfb13ec00b901b2dd6._comment | 13 + doc/forum/non-bare_repo_on_cloud_remote.mdwn | 6 + ..._da0c023af7c78f1ef1cfe1143a900a9f._comment | 10 + ..._71baea93f6caaf7b81a9ac00bee91e5e._comment | 67 + ...not_finding_git-annex-shell_on_remote.mdwn | 21 + ..._84881cad02c251a2515cec50fc22bf16._comment | 16 + ..._f32412f8d3b84cd5cb3c4d5d6bb60f32._comment | 36 + ..._dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment | 8 + ..._71ae60efcacdba5e11548923b2c85b95._comment | 10 + doc/forum/not_getting_file_contents.mdwn | 1 + ..._4a0f7f4de9c9bc4d13db033cb75d20af._comment | 10 + ..._dc7403e1b551552f9fd00da6a1453570._comment | 8 + .../one_annex_versus_many_annexes__63__.mdwn | 10 + doc/forum/one_or_many_annexes__63__.mdwn | 7 + ..._656d96011801d67a45b0b3bb3d70fa63._comment | 8 + .../overmounting_repository_at_home.mdwn | 12 + ..._399ac5014c489698e1e45deec4db7311._comment | 10 + ..._d006d89ba204568cdee0731b6251ec1a._comment | 11 + ..._3734b50c37cbec675813cbeca7bf4ce9._comment | 8 + ...artial_synchronisation._android_phone.mdwn | 7 + ..._2a48569277945a9c334bdfc51f8fd01f._comment | 8 + ..._550ae91c8a1fe060368c4682d37514b6._comment | 8 + ...nce_and_multiple_replication_problems.mdwn | 17 + ..._a2cdf1a4840f099f6bc941fd8de966c7._comment | 16 + ..._e65b360706c66ede6e0e841b2ebbbfbc._comment | 8 + ..._ad7cb4c510e2ab26959ea7cb40a43fef._comment | 14 + ..._23a6dc7ea569944ca55bd21851dd770d._comment | 14 + ..._8df6cc8b72e0e78c7380f7d471124498._comment | 12 + ...it_on_ssd__44___annex_on_spindle_disk.mdwn | 12 + ..._b3f22f9be02bc4f2d5a121db3d753ff5._comment | 8 + ..._f94abce32ef818176b42a3cc860691ae._comment | 20 + ..._0c8e77fe248e00bd990d568623e5a5c9._comment | 10 + ..._4b7e8f9521d61900d9ad418e74808ffb._comment | 8 + ..._7abbbe7db3988a2d239d11b0a4c597e7._comment | 10 + ..._46bd45fdc25d9c583f4ebe3a9730ab9f._comment | 8 + ..._log_file_after_upgrade_to_5.20140517.mdwn | 13 + ..._807d7da99f732f2fa5f9d3cb1ba9f1a1._comment | 8 + ..._92a7509fc42ab2347d57f080081d14b5._comment | 8 + doc/forum/post-copy__47__sync_hook.mdwn | 14 + ..._c8322d4b9bbf5eac80b48c312a42fbcf._comment | 11 + doc/forum/preferred_content.mdwn | 11 + ..._9c9e5f2ee5ae4d8459358ad16f879ef1._comment | 10 + ...ontent_settings_for_multiple_symlinks.mdwn | 7 + ..._70da012d96ab576151fe3e081ef905d1._comment | 10 + ..._ccea74d8b5a4de1f3cd1f6da6694ae0e._comment | 8 + ..._fab70c642d5aaf26de05270860281030._comment | 10 + ..._3cbd06de53b6a13e2741124a8e7b5b5b._comment | 10 + ..._963558ab261d8a6315402d371e8348f9._comment | 10 + doc/forum/public-web-frontend.mdwn | 16 + ..._c73bd2dfe020c25eaad1c0707dd2db01._comment | 9 + ..._0026d7be6b17e50d86b3b54985882f80._comment | 14 + ..._only_annex_without_location_tracking.mdwn | 7 + ..._47262f048a87fd6b781090f880a9bf99._comment | 12 + ..._ec3ff6487c9e5c89c7e508d72518bd50._comment | 10 + doc/forum/pulling_from_encrypted_remote.mdwn | 12 + ..._e9d6a9a6e01d01edb41a11b0da11d74d._comment | 10 + ..._8d0db2ff65ce935c6e68044a3e0721a8._comment | 16 + doc/forum/pure_git-annex_only_workflow.mdwn | 46 + ..._683768c9826b0bf0f267e8734b9eb872._comment | 8 + ..._6b541ed834ef45606f3b98779a25a148._comment | 30 + ..._ca8ca35d6cd4a9f94568536736c12adc._comment | 10 + ..._00c82d320c7b4bb51078beba17e14dc8._comment | 8 + ..._b63568b327215ef8f646a39d760fdfc0._comment | 32 + ..._cb7c856d8141b2de3cc95874753f1ee5._comment | 12 + ..._a32f7efd18d174845099a4ed59e6feae._comment | 32 + ..._66dc9b65523a9912411db03c039ba848._comment | 15 + ..._9b7d89da52f7ebb7801f9ec8545c3aba._comment | 12 + ..._dc8a3f75533906ad3756fcc47f7e96bb._comment | 20 + ..._afe5035a6b35ed2c7e193fb69cc182e2._comment | 24 + ..._3660d45c5656f68924acbd23790024ee._comment | 12 + ..._33db51096f568c65b22b4be0b5538c0d._comment | 15 + ..._6e5b42fdb7801daadc0b3046cbc3d51e._comment | 12 + ..._ace319652f9c7546883b5152ddc82591._comment | 14 + doc/forum/purge_files_with_no_copies.mdwn | 3 + ..._12b578689eb8d5d38c06261ec65e2109._comment | 12 + ...out_assistant_and___47__archive__47__.mdwn | 22 + ..._97890e26072af9277144651e3fdcada0._comment | 10 + ..._542bf265e35a976ac76767762d67d617._comment | 104 + ..._bafe99159df2adcd5fecc0d67bbf05a5._comment | 8 + ..._e77fa2992d9302a49a05f514c81612ca._comment | 10 + ...ld_location_log_from_encrypted_remote.mdwn | 35 + ..._f84f955fed7b96ae6208b6ff2ec650cd._comment | 12 + ..._c0b2ce3bc7cd55a0c77ddc31493068c2._comment | 10 + ..._06a73ca3dc73399ff000b642cca72de7._comment | 10 + ...ndirect_renames_on_direct_repo___63__.mdwn | 254 + ..._f4b0a14373c75cb752597c832e296bcc._comment | 17 + ..._8c86dfc99f0b9040402c9d746decda53._comment | 41 + ..._0246fff6c7c75f6be45bd257ec3872a5._comment | 75 + doc/forum/recover_deleted_files___63__.mdwn | 66 + ..._d7abb7c45c6ec2723a04f153ed215453._comment | 8 + ..._8ea2acaa30d3ee7e9f75310f4ec859b2._comment | 8 + ..._376de81c70799bf409be189a48234815._comment | 12 + ..._2e73ac530d65a01768a57058b7220a29._comment | 8 + .../recovering_from_repo_corruption.mdwn | 11 + ..._01fc85037e24fc70e5c5329898cf6781._comment | 15 + ..._3bd1c0bf25a0e892e711a60f53cd5298._comment | 8 + ..._679dde8ca0081fc6854d6d2e8a42abdb._comment | 8 + doc/forum/recovery_from_failed_merge.mdwn | 7 + ..._84e5b55d473d16bc9bdba5d88dc29bc3._comment | 10 + ...annex__44___does_not_recognize_remote.mdwn | 8 + ..._c1962d757dd22f49e774afa13a9862ca._comment | 10 + ..._1f0f4a1dc89643cee81ff7199b55e747._comment | 8 + ...ity__47__completeness_of_XMPP_updates.mdwn | 7 + ..._e0f7aa48d54fc0564f41c3a569c723b7._comment | 12 + ..._4e74039a673c16c0163f2cfb406dc4c3._comment | 8 + ..._41ade4fe72804b2f06cd4dbf405c1746._comment | 8 + doc/forum/relying_on_git_for_numcopies.mdwn | 47 + ..._8ad3cccd7f66f6423341d71241ba89fc._comment | 36 + ..._be6acbc26008a9cb54e7b8f498f2c2a2._comment | 18 + ..._43d8e1513eb9947f8a503f094c03f307._comment | 8 + doc/forum/remembering_state.mdwn | 5 + ..._4a6ac5f50dfa5a17a0f0ccd0c2e7a466._comment | 8 + ..._1b02d3713a2986bc027d166589a11c3f._comment | 9 + ..._b48775ea1e90b061b084f61a4a9baca5._comment | 19 + ..._cbebcc6ed4bdae6815c0576475e96f6a._comment | 8 + ...ent_repositories_are_bare__33____63__.mdwn | 17 + ..._234241460f6c75a8376b303b8dd4e882._comment | 11 + ..._42dfc382d07af2a4f29c76016084f87c._comment | 12 + ...repo_corruption_in_usb_external_drive.mdwn | 41 + ..._d9122bb0cc3551d92877c299a25b9c9e._comment | 10 + ..._space_with_directory_special_remotes.mdwn | 2 + ..._cd17b624704d93b51931023f69573323._comment | 8 + ..._877ca1be23d1484a8a30cdaeb6630053._comment | 15 + ..._65910eeaf3c6fcfd03f22c2957293232._comment | 8 + doc/forum/retrieving_previous_versions.mdwn | 7 + ..._a4e83f688d4ec9177e7bf520f12ed26d._comment | 11 + ...es_for___42____42____42____42____42__.mdwn | 13 + ..._7754e2cfb72b034effe8642c1b3e593e._comment | 11 + ..._04e1da4352ef9f9be90253ea726e5f24._comment | 12 + ..._84aceb9a9d3e5bd14c044861f47e3b9d._comment | 10 + ..._2cd17d01edeb230197865e6ea0884de0._comment | 8 + .../rsync_asking_for_an_unknown_password.mdwn | 60 + ..._f23d1c04a27625089eaef5b4bb7f8456._comment | 12 + ..._ce4b399fdb2f04e30bd8a951994f1c80._comment | 10 + doc/forum/rsync_over_ssh__63__.mdwn | 2 + ..._ee21f32e90303e20339e0a568321bbbe._comment | 8 + ..._aa690da6ecfb2b30fc5080ad76dc77b1._comment | 8 + ..._2e340c5a6473f165dc06cc35db38e5c0._comment | 8 + ...rsyncing_.git__47__annex__47__objects.mdwn | 24 + ..._25eb9f7be5730337b9efd96dce9efd2e._comment | 10 + ..._d7ceae666c8a1951021d3c6e6ac39a11._comment | 8 + doc/forum/s3_vs_ssh_Performance_Problems.mdwn | 8 + ..._65f064f09d7850abecab97007b0d30f0._comment | 12 + ..._baaf2384d9196077268e9ca9bbe3b871._comment | 8 + ..._dc44be42070c073d150c476406e9b425._comment | 10 + ..._f9c3ef3b1b44bfb29125acb6ec621f38._comment | 10 + .../safely_dropping_git-annex_history.mdwn | 20 + ..._a4b93a3fbc98d9b86e942f95e0039862._comment | 8 + ..._383882fafd32f25ed22b5eb2fb3691b9._comment | 18 + ..._47794a2abf29bf4ea2763ff89d872ab4._comment | 8 + ..._4fd76d10a93fe01588fce7a621f9254d._comment | 12 + ..._10ecf3220ffcbbe94ba09da225458f18._comment | 12 + ..._e3beb8acb075faaeef6c052aecbf0a41._comment | 50 + ..._61a5fe2e7e47c60a8b237ea69404a37f._comment | 8 + ..._426d02e2f2a2ae4ec7eae02dfe4519b3._comment | 9 + ..._410a7296c2cee16d3d5bb618a5a41c1d._comment | 10 + ..._42cf492fc98a9eba8176387749ef12e0._comment | 8 + ..._c0327ada073d8b69535f71b4dc6aa57e._comment | 21 + ..._f83d6090aea2b7d5d54c876df940cbad._comment | 40 + ...o_build_fine_on_haskell_platform_2011.mdwn | 1 + doc/forum/shared_cipher_tries_to_use_gpg.mdwn | 10 + ..._760961eaaa7d5c254dd71c5792437c9e._comment | 12 + ..._f3260aea3a5bb9b95a9bdf1d0dfce090._comment | 8 + ..._really_good_happened_with_3.20130124.mdwn | 5 + ..._1712bddd2f483a353f6313aa626445f1._comment | 8 + .../sparse_git_checkouts_with_annex.mdwn | 31 + ..._c7dc199c5740a0e7ba606dfb5e3e579a._comment | 12 + ..._e357db3ccc4079f07a291843975535eb._comment | 8 + ..._fcfafca994194d57dccf5319c7c9e646._comment | 8 + ..._04dc14880f31eee2b6d767d4d4258c5a._comment | 20 + doc/forum/special_remote_for_IMAP.mdwn | 44 + ..._7c7d4b57a1b6508fff1a6b0508c861f8._comment | 10 + ..._9c46fe8a857aa7a5ce797288144386bd._comment | 8 + ..._27e3b644df6942ce4c103236d0d5cb1b._comment | 23 + doc/forum/special_remote_for_iPods.mdwn | 5 + ..._37cc3dc740341cc663074fd3bfb85947._comment | 8 + ...sistant_startup_on_large_repositories.mdwn | 1 + ..._5ba637a0f6d01ba24fe25e6265134e0a._comment | 10 + ..._d65746697977f8971a4b59f5b413f926._comment | 13 + ..._be6c4fe5a0c745688438b716973791cc._comment | 12 + ..._a07472338a08c068a9b88b2176fc2bee._comment | 9 + ...ation:_read:_Connection_reset_by_peer.mdwn | 28 + ..._87b9540e37abb16c0ec7605f5ab204a5._comment | 8 + ..._bd3383c142bf93d9cd496cb668d7782c._comment | 12 + ..._9b1911ae6468d09dae74ab1a60d2757b._comment | 12 + doc/forum/ssh_key_setup_woes_in_Android.mdwn | 15 + ..._f16fbff27a449409699f3dbcf9590622._comment | 10 + doc/forum/ssh_password.mdwn | 3 + ..._a3e5a41e1d4da683d577976b134b11ee._comment | 10 + ..._fa261676a99d49d4b237b0d43048d76d._comment | 10 + ...itory__34___option_during_setup__63__.mdwn | 3 + ..._7244794579a191a677190c60758f32e7._comment | 8 + ..._277cf12907bd7c5930eb4f137b115e29._comment | 8 + doc/forum/ssh_vs_cifs__47__webdav.mdwn | 7 + .../start_assistant_from_command_line.mdwn | 11 + ..._f8dfce1fca9f1212ccaf84e431db71a9._comment | 12 + ..._e769c5d09afbff85961363ddc5eb4019._comment | 10 + doc/forum/switching_backends.mdwn | 12 + ..._ecf4109c1148dafde3519243ae3c5a03._comment | 10 + ..._21f465a18f40b95dafd307fce0de659a._comment | 8 + ..._4c13d22c1695195e6b101bd20ef6bb42._comment | 35 + ..._e1d4a48baac23fd3f67b20eba4eee8af._comment | 8 + ...irect_mode_while_assistant_is_running.mdwn | 2 + ..._7832243a36613c48d0077b438dbf8b4a._comment | 10 + ...sync_between_indirect_and_direct_mode.mdwn | 6 + ..._7efc0d79196675582571c05fdd133b53._comment | 8 + ..._8ac84dbaf7a4d503497487cbdb1749d8._comment | 8 + ..._9acb237711669ec6046a8d07f9ed3b2c._comment | 8 + .../sync_stages_deletions_on_remote.mdwn | 72 + ..._2b639066095e450c2d9be3b2775d24b3._comment | 8 + ..._da5775526a2a476b6ead1cd1a735b8bd._comment | 8 + ..._9e07593228915936fadcf90373be9f4e._comment | 14 + ..._e5a3dc34c6229ec40bc999c3cab28041._comment | 8 + doc/forum/syncing_home_directories.mdwn | 7 + ..._220a6e0ffe0ea610921a63c0a6e3beab._comment | 16 + .../syncing_non-git_trees_with_git-annex.mdwn | 46 + ..._7f9593bdfd95e4a8814e6cc5c44619e6._comment | 24 + ..._49f15478781a0ad5e46e75319070335c._comment | 16 + ..._6d8f399f0549eddd1d1f5c9c9a10c654._comment | 13 + doc/forum/taskwarrior.mdwn | 11 + ..._1c3a29e7d292cb602d9d349f8009b51e._comment | 10 + ..._4b3d70501763f6d36c927ae37bbd33c2._comment | 8 + doc/forum/telehash_syncing.mdwn | 10 + ...ll_us_how_you__39__re_using_git-annex.mdwn | 6 + ..._4884803ddee7f642a3ac995a19967a6a._comment | 17 + ..._61f5054918e7b36c191454365bc7f3b7._comment | 10 + ..._db07e8703be606c998c831e91d300d69._comment | 10 + ..._a58595969cdd42ed20210e9615b42e42._comment | 22 + ...95__remotes__47__hook_with_tahoe-lafs.mdwn | 22 + ..._76bb33ce45ce6a91b86454147463193b._comment | 10 + ..._4d9b9d47d01d606a475678f630797bf9._comment | 10 + ..._8a812b11fcc2dc3b6fcf01cdbbb8459d._comment | 12 + ..._fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment | 39 + ..._c459fb479fe7b13eaea2377cfc1923a6._comment | 8 + ..._2e9da5a919bbbc27b32de3b243867d4f._comment | 23 + ..._d636c868524b2055ee85832527437f90._comment | 20 + ..._39dc449cc60a787c3bfbfaaac6f9be0c._comment | 10 + ..._2592749c2f02b3e151896e31acba359b._comment | 8 + ...tes_syncing_to_gcrypt_based_ssh_repo_.mdwn | 7 + ..._4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment | 10 + ..._82dc18ed14879936d04133f248879fb9._comment | 10 + ...d_repositories:_fatal:_not_a_git_repo.mdwn | 32 + ..._0a755a4a281c3bd130722093c8ddd080._comment | 10 + doc/forum/ui.mdwn | 11 + ..._f3e3446b05d6b573e29e6cad300fb635._comment | 10 + ..._b493ee97eb2378e72c12f3d137109580._comment | 15 + doc/forum/unannex_alternatives.mdwn | 9 + ..._dcd4cd41280b41512bbdffafaf307993._comment | 46 + ..._58a72a9fe0f58c7af0b4d7927a2dd21d._comment | 36 + ..._b1687fc8f9e7744327bbeb6f0635d1cd._comment | 16 + .../unknown_response_from_git_cat-file.mdwn | 8 + ..._f26ba569e715fe69b6de3093930362ee._comment | 8 + .../unlock__47__lock_always_gets_me.mdwn | 11 + ..._dee73a7ea3e1a5154601adb59782831f._comment | 12 + ..._f89b4349dde840c355a3bc28908decdf._comment | 8 + ..._acbab7b75726d34dccb5c9dab7b3e728._comment | 8 + doc/forum/unrelated_repositories_sync.mdwn | 15 + ..._c899b7b05a96d14e25c2efadff3b4e52._comment | 10 + doc/forum/unsynced_folder.mdwn | 3 + ..._7d7a262f067c7b02d76e82637223934c._comment | 22 + doc/forum/update_via_cabal_fails.mdwn | 35 + ..._e1235dc2acd3bac3dd51b7614dabbb88._comment | 8 + ...ting_the___34__number_of_copies__34__.mdwn | 14 + ..._327bdb0d9c190c60c7147b3acf07af09._comment | 10 + ..._7e11c839637e0894332e413cde02cee9._comment | 8 + ..._8b7a70fb3bb41e4eda412302834730bb._comment | 8 + ...tifier_of_objets___40__doi_like__41__.mdwn | 20 + ..._955f3aac12c1ddb41267c5a23ccb79e3._comment | 12 + ..._0aff36755f49afddd5482a602a1ccd2b._comment | 10 + doc/forum/use_existing_ssh_keys__63__.mdwn | 5 + ..._c420c53f022bbd1b28494bc44d076feb._comment | 8 + ..._e4cae848e5701852073ced307832872b._comment | 12 + ..._a97c20b6df74c49e5f57c7caf962f1e2._comment | 10 + ...2_directories___40__like_unison__41__.mdwn | 7 + ..._5c3ee8a8aaa6d0918c0cc9683ce177ae._comment | 10 + ..._648946353c6d90c57351cce4010f1301._comment | 10 + doc/forum/version_3_upgrade.mdwn | 9 + ..._05fc9c9cad26c520bebb98c852c71e35._comment | 13 + doc/forum/view_from_numeric_values.mdwn | 9 + ..._f3c440f3f0104002a0020ba96ddcf87b._comment | 11 + ..._2414e1a8cfd154c339d8fc0e4a630ae9._comment | 12 + ..._7879a11cc9767cdaac14f9993182dc25._comment | 13 + ..._517c7659654a6fc608eb3332053df8a4._comment | 28 + .../view_including_files_with_no_tags.mdwn | 5 + ..._b0aafc023fbec33af268576c4c199af3._comment | 24 + ..._5ae9d5308371bdb1f94342c9f9b01aff._comment | 8 + ..._40__branches__41___never_get_deleted.mdwn | 16 + ..._ff53fa0b5f0c4a6554a37e3309e26925._comment | 12 + ..._1d4a3f4e83b288262e291262a6636602._comment | 21 + ..._4e96e5325fd12e48f190fe551a6ac07e._comment | 12 + ..._a4764b5bfb08ebe90430ea14fcb6e8e0._comment | 10 + ..._02e08dffb01246010b390aeef8f32234._comment | 8 + doc/forum/vlc_and_git-annex.mdwn | 11 + ..._9c9ab8ce463cf74418aa2f385955f165._comment | 10 + ..._037f94c1deeac873dbdb36cd4c927e45._comment | 8 + ...existent_ref__44___unable_to_checkout.mdwn | 69 + ..._c0d9758be80d1a349ffe82c80075bebd._comment | 12 + ..._c28dae2eb0ab825ee6d43735e04a18a3._comment | 22 + ...webapp___47___assistant_without_watch.mdwn | 9 + ..._1bcd99aa81f937ded683e19a69d33dd9._comment | 10 + ..._9f5b3f5bf7fedcd5baec519d97d3aa8c._comment | 16 + doc/forum/webapp_and_manual_mode.mdwn | 7 + ..._5b5df5ffeb6ee15779972f13fdc11729._comment | 10 + ..._a1f06b50d1317c78a301b47eb05d2617._comment | 19 + ..._f0739bf4304a91a5d4ec33ac2421c966._comment | 9 + doc/forum/webapp_does_not_start.mdwn | 72 + ..._dd27d30ce305562a1552f46c87b1cd27._comment | 12 + ..._ef37f40288a1181ca619ae13b0f7a994._comment | 8 + ..._6e625dba9f7fa36bf9c7e9d77fbadeff._comment | 9 + .../webapp_listen_port_with_autostart.mdwn | 3 + ..._65dbcf3d8f6c16568f5a326242eab9c5._comment | 20 + ..._39664f833dedc1a4fe083eec9bc4a7cd._comment | 75 + .../what_happens_to_deleted_files__63__.mdwn | 24 + ..._a476174646ad3adfbbe0cafdd7d42d08._comment | 10 + ...and_with_file_names_instead_of_hashes.mdwn | 7 + ..._4eaca07152916adc18032fb404e4dd92._comment | 10 + ..._94b43ac23ff8332b35723422eede8997._comment | 8 + ..._45ffa6dd17667ecd6685f85f34046eff._comment | 10 + ..._d459fbcf0db59b821ae67f4949e48103._comment | 14 + ..._e52a8c9cb418fbc2e2cba71f37bd44ad._comment | 8 + doc/forum/windows_port__63__.mdwn | 2 + ..._23fa9aa3b00940a1c1b3876c35eef019._comment | 9 + ...et__47__drop_via_webapp_file_explorer.mdwn | 1 + ..._c818a6d44dc13a56460b1865f70eb97c._comment | 8 + ...ake_copy_stop_on_exhausted_disk_space.mdwn | 4 + ..._467e5e3db3e836030bc4b4f15846951f._comment | 12 + ..._e3ca3db9bea11d3e085ee9c3c56b33fe._comment | 8 + ..._0ef8c37350fc192d9b784fbab1d9f318._comment | 8 + .../working_without_git-annex_commits.mdwn | 20 + ...peared__44___broken_symlink_showed_up.mdwn | 27 + ..._00b084f9786de6516f46065c0cb00e79._comment | 11 + ..._138499b36d28c5e267b4aad8792dc87e._comment | 48 + ..._6c59c494b563e56d061417eb2216bb19._comment | 8 + ..._ccbba61cdd6fce3e5de82417bcc0cbfb._comment | 12 + ..._50526283b35997cece2f087507cdd4ee._comment | 12 + ...de_to_track_my___47__home__63____63__.mdwn | 7 + ..._b011442de2f67f3ad340031a0767e990._comment | 8 + ..._c69865c08c3eb49d64310fc76e80c65d._comment | 8 + ..._7651fb48fc71b2c7b4e7b6830a0f9865._comment | 10 + ..._7d88f1aa163185c801b7697846086c7f._comment | 12 + doc/future_proofing.mdwn | 38 + doc/git-annex-shell.mdwn | 133 + doc/git-annex.mdwn | 1793 ++++ doc/git-union-merge.mdwn | 38 + doc/how_it_works.mdwn | 42 + ..._b3bdd6a06d5764db521ae54878131f5f._comment | 14 + ..._2a8ce5859040d815e6234fc18f5f1961._comment | 10 + doc/index.mdwn | 46 + doc/install.mdwn | 33 + doc/install/Android.mdwn | 37 + ..._225f2c6fe255be93702cfbd4dc172f3b._comment | 8 + ..._4b565e73f02f0e84bdf7e686b0d7bf5f._comment | 8 + ..._4e970633d9073fcf4bc33f3fff2525b2._comment | 10 + ..._87da4f379a0276b662583e7e22061218._comment | 8 + ..._f9ced494a530e6ae3e76cfbaddb89f5d._comment | 8 + ..._74cccae04ea23a8600069c7e658143aa._comment | 8 + ..._82c7cb31d19d4e18ca5548da5ca19a79._comment | 8 + ..._cebaa8ee5bbed27d9b2d032ca7bdec6e._comment | 8 + ..._34f7c42050fa48769a6bfae60d72e477._comment | 8 + ..._f3d289b78d6bdb3cc65689495a8439a5._comment | 11 + doc/install/ArchLinux.mdwn | 19 + ..._da5919c986d2ae187bc2f73de9633978._comment | 8 + ..._e5f923e6d81cfb3fba7a72f60baaf4ab._comment | 16 + ..._8e607cd883ec174571e9dfe3b25bfd05._comment | 8 + ..._a378391dd218859f381c479259dd8fe3._comment | 10 + ..._cbc960cd78bf5b90e3bb6cb605d6d970._comment | 10 + ..._1d597d6a95f9c2df7dae6e98813e4865._comment | 36 + ..._2d708977e2fad6b68803494576382df5._comment | 10 + ..._5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment | 15 + doc/install/Debian.mdwn | 20 + ..._a34e23d9aa3027012ab1236aa4f7d5cb._comment | 8 + ..._20d8271ba3f6cfe3c8849c3d41607630._comment | 8 + ..._89f67da4a4a6a626a7db9c6674b244b6._comment | 11 + ..._ef7f3e88d61833e51f0302e938343818._comment | 10 + ..._029486088d098c2d4f1099f2f0e701a9._comment | 9 + ..._648e3467e260cdf233acdb0b53313ce0._comment | 8 + ..._4d922e11249627634ecc35bba4044d9e._comment | 8 + ..._2a93ab18b05ccb90e7acc5885866fca2._comment | 9 + ..._1bccc7bf7a4ef61a9b30024b9b22ba7d._comment | 12 + ..._5b5a3b0e8abe8831a6a15a4e258d14fd._comment | 10 + doc/install/Docker.mdwn | 32 + doc/install/Fedora.mdwn | 40 + ..._c4db84e672ad4b45b522db735706b00f._comment | 16 + ..._f98c488c09bef86e2b0414589ce9e141._comment | 25 + ..._d872acf8865fe7c99a9b712db5b38ea4._comment | 8 + ..._93b3402e4c51e1a5c96f907bb528164b._comment | 16 + ..._0427e0503764b29e57abf9e97155136b._comment | 15 + ..._1b1b38a79251fe2e8c1e4debbe3bc3c5._comment | 12 + ..._4832d271dcc63a6cd1c40fe38ad5e367._comment | 24 + ..._80e167cde1a6511683a8f6e8029c0da6._comment | 10 + doc/install/FreeBSD.mdwn | 2 + doc/install/Gentoo.mdwn | 3 + doc/install/Homebrew.mdwn | 21 + doc/install/Linux_standalone.mdwn | 34 + ..._1adc00aecc51f1e74701bd67cd74155d._comment | 8 + ..._7983285b56fd10359a7cc3615fd1e2fe._comment | 12 + doc/install/NixOS.mdwn | 6 + ..._4e487ddd2654a8a992c1538b9c3bf003._comment | 21 + doc/install/OSX.mdwn | 55 + ..._cd2120552ef894a37933b328136fa4cc._comment | 8 + ..._740fa80e2e54e6fb570f820ff1f56440._comment | 8 + ..._a84028080578a8b60115b6c4ef823627._comment | 8 + ..._d6f1db401858ffea23c123db49f5b296._comment | 8 + ..._035f856923276b0edad879e196e94097._comment | 9 + ..._336e0acb00e84943715e69917643a69e._comment | 35 + ..._1befafa862b7d07b1f6e57c0182497cf._comment | 36 + ..._19c08b2c6c2c5cd88bf96d2bcbbd9055._comment | 10 + ..._537fad5d8854e765499d47602d1ab398._comment | 8 + ..._18d4377f4ded5604d395d73783ba82c9._comment | 8 + ..._3e6a3c00444badf2cf7a9ee3d54af11e._comment | 8 + ..._987f1302f56107c926b6daf83e124654._comment | 11 + ..._6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment | 12 + ..._3d82a270dd4b0159f4aab5675166e1e3._comment | 30 + ..._b9d3563a2cc3d769f27876e028dc344d._comment | 12 + ..._db90984062a07576a4777b2d743161f1._comment | 24 + ..._2a60108a440231ba83f5a54b6bcc5488._comment | 14 + ..._d453510b9bb62072a4c663206c12c8a4._comment | 8 + ..._0970bfd63137ea48701dff6aea1b4bcb._comment | 18 + ..._8622ed56c6a8034c20fb311418d94003._comment | 8 + ..._25552ff2942048fafe97d653757f1ad6._comment | 8 + ..._ce58633ef5b2f8f4caa7e626358f33be._comment | 8 + ..._09084a7b3cf06bfa3add0f4991476ffe._comment | 10 + ..._a46d8e3e7795b9afb1e1c2be943d12af._comment | 10 + ..._203a36322b3c453c05c8906c64e62e06._comment | 8 + ..._874ff01f27911baf6ef0f559d5d5f5a0._comment | 27 + ..._47a77a03040fe628109bd54f82f9ad7a._comment | 17 + ..._25cac8bcd84a5210fc0a5243260b8cc7._comment | 18 + ..._bbe99673033e4c48c8bb3db24ee419f9._comment | 8 + ..._39b4b748b4586bf32b37edfefef84bba._comment | 8 + ..._1a9c91ef43edc4148947f202ff604114._comment | 8 + ..._892f7e65f95f43697164267c4b71c0d5._comment | 8 + ..._38d9c2eea1090674de2361274eab5b0e._comment | 29 + ..._35bf3812db6f3ef25da9b3bc84f147c5._comment | 8 + doc/install/OSX/old_comments.mdwn | 1 + ..._4d15bfc4fc26e7249953bebfbb09e0aa._comment | 11 + ..._798000aab19af2944b6e44dbc550c6fe._comment | 10 + ..._707a1a27a15b2de8dfc8d1a30420ab4c._comment | 10 + ..._60d13f2c8e008af1041bea565a392c83._comment | 8 + ..._a6f48c87c2d6eabe379d6e10a6cac453._comment | 8 + ..._6ef2ddb7b11ce6ad54578ae118ed346e._comment | 9 + ..._6fd1fad5b6d9f36620e5a0e99edd2f89._comment | 9 + ..._af6fe3540032cdf4400478de87771058._comment | 30 + ..._8d3a0596db67108041728b20f2790f31._comment | 7 + ..._0a1760bf0db1f1ba89bdb4c62032f631._comment | 13 + ..._0327c64b15249596add635d26f4ce67f._comment | 19 + ..._7683740a98182de06cb329792e0c0a25._comment | 25 + ..._c9362141d15a2f68a75df9f8bfe29da0._comment | 17 + ..._8106196c3fef70652cb2106e2d5857db._comment | 8 + ..._47c682a779812dda77601c24a619923c._comment | 8 + ..._733147cebe501c60f2141b711f1d7f24._comment | 16 + ..._b090f40fe5a32e00b472a5ab2b850b4a._comment | 8 + ..._fc092412e99cf4c5f095b0ef710bc4de._comment | 8 + ..._d513e21512a9b207983d38abf348d00f._comment | 16 + ..._d68c36432c7be3f4a76f4f0d7300bac9._comment | 20 + ..._e6109a964064a2a799768a370e57801d._comment | 30 + ..._50777853f808d57b957f8ce9a0f84b3d._comment | 10 + ..._626a4b4bf302d4ae750174f860402f70._comment | 8 + ..._18a8df794aa0ddd294dbf17d3d4c7fe2._comment | 7 + ..._2ce7acab15403d3f993cec94ec7f3bc6._comment | 14 + ..._a93ad4b67c5df4243268bcf32562f6be._comment | 39 + ..._ae3ed5345bc84f57e44251d2e6c39342._comment | 14 + ..._c6b1b31d16f2144ad08abd8c767b6ab9._comment | 23 + doc/install/ScientificLinux5.mdwn | 62 + doc/install/Ubuntu.mdwn | 44 + ..._490e065314693423ab6969d8ae6978fe._comment | 8 + ..._4ebac3fb43de854ed1a3b1d2ea94011a._comment | 10 + ..._38f69dffe2db0d15e4c4e5cb47f40ef8._comment | 8 + ..._d1c511153fe94bf33e19a1281f1c92f2._comment | 8 + ..._ad13886c1c1f76d1cd995ea7b7d8471c._comment | 8 + ..._a08817322739b03cf0fec97283b16f1a._comment | 8 + ..._fe0997e56136bd30749f0995cbf19b56._comment | 12 + ..._fbb5306a162db1a1ee9efa3523aac952._comment | 11 + ..._a97e7f0e62ac685c3ded423bddeaa67f._comment | 14 + ..._921a223fd7e679b9ced3d8ba5ce688e0._comment | 8 + ..._1f943cb084fa8e21bc6ee5fc3118f02f._comment | 8 + ..._c2f8b35ada873acb1ce593b04e2899fe._comment | 11 + doc/install/Windows.mdwn | 39 + doc/install/cabal.mdwn | 58 + ..._7ebe353b05d4df29897dc9a4f45c8a91._comment | 8 + ..._0d06702e6e0ae3cd331cf748a9f6f273._comment | 44 + ..._b93ca271dffca3f948645d3e1326c1d9._comment | 12 + ..._3dac019cda71bf99878c0a1d9382323b._comment | 8 + ..._14b46470593f84f8c3768a91cb77bdab._comment | 9 + ..._c3a5b0aad28a90e0bb8da31a430578eb._comment | 8 + ..._4faf214f97f9516898d7c17d743ef825._comment | 10 + ..._2a9d6807a3a13815c824985521757167._comment | 10 + ..._1efa0c7a963ec452fc6336fbe4964f6e._comment | 10 + ..._6f42f9234f9ff6a2ca6bbb4d2643843e._comment | 44 + ..._f04df6bcd50d1d01eb34868bb00ac35c._comment | 18 + ..._0f553be2a4c666e3bed58b2bce549406._comment | 8 + ..._f91a6ec21e96eced73ea9579fd8cbd15._comment | 8 + ..._2f27b78215f97ade1986ca806c634cb3._comment | 16 + ..._c34d2b1d95830a3e58671a5b566a1758._comment | 8 + ..._40cbde8ec067b3a860e6df1a9bea5f76._comment | 8 + ..._8a7664e6f9271718dc607a0782366c5b._comment | 8 + ..._bd455c732639728bce2bfc39e32871d2._comment | 8 + ..._c080e9239b6eec88d329c28da7bb4141._comment | 17 + ..._15951dd070a675300420eea137a28ef9._comment | 10 + ..._ac082dca67f4a29b06070c0283130f52._comment | 39 + ..._a69d17c55e56a707ec6606d5cdddee25._comment | 17 + ..._ad639c07cb79e89406e95c1dafce3a01._comment | 35 + ..._4763b24a29627d55f465b9ea260ea7ec._comment | 22 + ..._1d34c294486c85b1149675fa5861ae35._comment | 10 + ..._8d4dfc33cada6091c30d3a43ce404b8b._comment | 21 + ..._38451e751add6daf479b559c4b6a7c61._comment | 8 + ..._4d44e4531e6686bd340f26836ad40026._comment | 8 + ..._2a095a5af53a356bd29abd22a9cb1bea._comment | 16 + ..._f33e1a4575dccc20b0d3d7c00e6db709._comment | 69 + ..._5c1e96221154a4ae4ebd636232044ced._comment | 16 + ..._55bed050bdb768543dbe1b86edec057d._comment | 10 + ..._2ff7f8a3b03bea7e860248829d595bd1._comment | 14 + ..._8789fc27466714faa5a3a7a6b8ec6e5d._comment | 24 + ..._5afb2d081e8b603bc338cd460ad9317d._comment | 21 + ..._129c4f2e404c874e5adfa52902a81104._comment | 22 + ..._738c108f131e3aab0d720bc4fd6a81fd._comment | 8 + ..._5ddbba419d96a7411f7edddaa4d7b739._comment | 12 + ..._0aa16754fb08d8f2a54c8c3f78b6c187._comment | 14 + doc/install/fromscratch.mdwn | 27 + ..._9d085e460553fa045999ab7cb945cdec._comment | 13 + ..._b7954521d9ab40622b665f278dd72e17._comment | 10 + ..._a3bf3ce57ea73515a059267f25b816eb._comment | 23 + doc/install/openSUSE.mdwn | 3 + doc/internals.mdwn | 247 + ..._4b8ed353dca4f484b3b6eb463fa02fd8._comment | 8 + ..._c19232d5cc4976c2e5b014aef6e8d9ec._comment | 8 + doc/internals/hashing.mdwn | 38 + ..._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 + ..._d367fdaf0425b59d694bf16059d47192._comment | 9 + ..._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 + ...rebox_a_FUSE_filesystem_for_git-annex.mdwn | 19 + ..._e238d1734238e37bb55ff952b32e06b8._comment | 9 + doc/news/version_5.20140529.mdwn | 25 + doc/news/version_5.20140606.mdwn | 14 + doc/news/version_5.20140613.mdwn | 16 + doc/news/version_5.20140707.mdwn | 23 + doc/news/version_5.20140709.mdwn | 11 + doc/not.mdwn | 55 + ..._d8fb9add7e98dadea2a39f8827f75447._comment | 10 + ..._6c23aba5a9c341f2d5e2007e4b43f2ea._comment | 8 + ..._a0ef1a045257659f0f8722e4987e0ccc._comment | 8 + ..._c5c20576388f18daba3af913b44fb001._comment | 8 + ..._837e3699014b73e8f2bd2a668eea9eef._comment | 23 + ..._ac7396ca125abb80a42f9aaaf61a6ab4._comment | 10 + ..._ab41bec1ccc884e71780cb9458439170._comment | 8 + ..._0e19ff7deb5ed65f2bc685d4c516d816._comment | 8 + ..._bab9584c41a25dda934ad230e3eb732d._comment | 8 + ..._b2a0d5a45ab8ddd66c29dde9412d7a12._comment | 51 + ..._f2829ecbe80a61aa9a8411d2403de69e._comment | 14 + ..._547fc59b19ad66d7280c53a7f923ea08._comment | 13 + ..._581e23cca0219711f8a4500a8d5d20fc._comment | 16 + ..._5c61457f117de38ef487e5cc2780d554._comment | 24 + ..._69aa47398a3c13ce64f146de985b727d._comment | 10 + doc/polls.mdwn | 2 + doc/polls/2013.mdwn | 5 + doc/preferred_content.mdwn | 179 + ..._f0bce3c67f293eaba97b92f0942876b6._comment | 8 + ..._7d45e21dfb016e9ffa4715346dd0c1a6._comment | 19 + ..._1ccd90b009245667ad59f4d29d2a3a37._comment | 8 + ..._384025b5fa23a3f175985a081438149f._comment | 8 + ..._6a9bc657bc7415f0e118357d8c6664c6._comment | 18 + ..._f0a957e67297c4bb5a8778c11b3c9fd4._comment | 9 + ..._b434c0e2aaa132020fd4a01551285376._comment | 12 + ..._c4acaa237bf1a8512c5e8ea4cdbd11b9._comment | 8 + ..._ff2a2dc9c566ebd9f570bdfcd7bfc030._comment | 27 + ..._f82538be42428691d7cab60a7add2e74._comment | 13 + doc/preferred_content/standard_groups.mdwn | 126 + ..._026e47e425d06c4b2580238b3187a379._comment | 13 + ..._460bae34ba7c05357318a202b2932d25._comment | 8 + doc/privacy.mdwn | 47 + doc/publicrepos.mdwn | 19 + doc/related_software.mdwn | 15 + doc/repomap.png | Bin 0 -> 67316 bytes doc/required_content.mdwn | 17 + doc/scalability.mdwn | 39 + doc/shortcuts.mdwn | 12 + doc/sidebar.mdwn | 12 + doc/sitemap.mdwn | 4 + doc/special_remotes.mdwn | 83 + doc/special_remotes/S3.mdwn | 53 + ..._c366f020c9b97a365e21878a33360079._comment | 10 + ..._c1da387e082d91feec13dde91ccb111a._comment | 12 + ..._59c3ecab7dbc8be53258460473cac21c._comment | 8 + ..._0789a21d980825188bb09f7fc8bba8be._comment | 33 + ..._29574a51d5831c51e2e765eb2c06e567._comment | 12 + ..._ceb9048c743135f6beca57a23505f0a3._comment | 8 + ..._7b79f8b5ef88a2775d61b5ac5774d3e0._comment | 8 + ..._4a1f7a230dad6caa84831685b236fd73._comment | 8 + ..._5b22d67de946f4d34a4a3c7449d32988._comment | 8 + ..._bcab2bd0f168954243aa9bcc9671bd94._comment | 8 + ..._38c0b062997fde1ad28facc05d973e83._comment | 12 + ..._409bc2b56382417cf26bb222fb783ba7._comment | 8 + ..._78da9e233882ec0908962882ea8c4056._comment | 10 + ..._6af9781004d982d8e6b20a83ad29eead._comment | 8 + ..._0fa68d584ee7f6b5c9058fba7e911a11._comment | 12 + ..._7ad757b3865b04967c79af0a263bb3b0._comment | 10 + doc/special_remotes/bup.mdwn | 39 + ..._f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment | 23 + ..._b53bceb0058acf4d1ab12ea4853ee443._comment | 24 + ..._65d923226cf6120349d807c5c60f640c._comment | 8 + ..._96179a003da4444f6fc08867872cda0a._comment | 43 + ..._612b038c15206f9f3c2e23c7104ca627._comment | 12 + ..._1186def82741ddab1ade256fb2e59e6f._comment | 17 + ..._7d22a805dd2914971e7ca628ceea69be._comment | 10 + ..._5942333cde09fd98e26c4f1d389cb76f._comment | 10 + ..._cb1a0d3076e9d06e7a24204478f6fa98._comment | 10 + ..._4cbc67e5911748d13cee3c483d7ece8a._comment | 12 + ..._ca7096a759961af375e6bd49663b45b3._comment | 10 + ..._e9881290486a1770bd260f8650ada9c6._comment | 8 + ..._e01b5cc5a0d81b071e93e27e7b91fe2a._comment | 8 + ..._13237170ef5b6646e0e25d3421af3fe5._comment | 10 + ..._1a36a0483a9db04d36e0234a192ebad8._comment | 12 + ..._a8419963dc024b1d9eb73807596012dc._comment | 8 + ..._95ccfdd22a2391daa99e0beb04adedd6._comment | 11 + ..._b9d238fb15ad7628e33c90b071e07bb0._comment | 12 + ..._cc21b81a8f809f6efa5f5b6332513fc3._comment | 12 + ..._3fe750118ff1edbe91a110b86fb5b662._comment | 10 + ..._6794eb52bd87c28ef1df3172aa7d5780._comment | 9 + ..._961276c18e9353ca8e25cad53e7ec51f._comment | 8 + ..._6b7242721f2f2c77b634568cb737e3e3._comment | 13 + ..._5c11e69c28b9ed4cbe238a36c0839a47._comment | 15 + ..._308afc586b86c66bbb3437d63864d9cb._comment | 16 + ..._0f5440e0e54cf7ac2a68b1ba115b0930._comment | 10 + ..._97543acfa7434e332ebea5672e446317._comment | 8 + ..._9229776623c234204c8b164edff95da0._comment | 8 + ..._3bbda479d13f6bf393dcd59ed94ddeaa._comment | 10 + ..._f7000975d38077828ab11a99095b39eb._comment | 8 + ..._5d2bd7c1e1493d3c3784708a9b0bc001._comment | 8 + ..._af01ee5ce31b1490af565cb087d65277._comment | 10 + ..._3d4ffec566d68d601eafe8758a616756._comment | 13 + ..._26af468952f0403171370b56e127830a._comment | 8 + doc/special_remotes/ddar.mdwn | 40 + doc/special_remotes/directory.mdwn | 39 + ..._86f8c1b09cbd82bcd76378dfa1b3ca07._comment | 49 + .../directory/comment_12._comment | 16 + ..._311cd013fd8db47856d84161119e059d._comment | 12 + ..._e8a53592adb13f7d7f212a2eb5a18a31._comment | 12 + ..._d949edad6a330079f9e15f703f9091e3._comment | 10 + ..._49009f4e9e335c9a9d0422aa59c9a432._comment | 8 + ..._f5e9b0b477c4e521f8633fd274757fa3._comment | 8 + ..._e790718423c41f5ea8047ea5225bfacd._comment | 11 + ..._325aac80b86588912c4fd61339ccbd0b._comment | 10 + ..._4206db69d68d9917623ce02500387021._comment | 12 + ..._acd9023511fe43817718bc89430f96c3._comment | 8 + ..._d330eb808a990bb71034613c297a265e._comment | 8 + doc/special_remotes/external.mdwn | 27 + doc/special_remotes/external/example.sh | 195 + doc/special_remotes/gcrypt.mdwn | 50 + doc/special_remotes/glacier.mdwn | 47 + ..._fcd856b99dc6b3f9141b65fe639ef76b._comment | 10 + ..._38fcca87074f6ea31a12569a822aa8c9._comment | 12 + ..._cea5bcb162e4288847ba5f25464a0406._comment | 28 + ..._0c92cc82c7ac513130f862391a02d329._comment | 8 + ..._8d1dcb4bf48386314bfb248ea6eeeb68._comment | 8 + ..._adb1db354dc4941e4b004e4ba34660d7._comment | 8 + ..._747e403aac5acaba00e220931e926951._comment | 10 + ..._a04bb5f27c1a7cfffe881903f973dbec._comment | 24 + ..._89c4506e079c299fd098d0fe746d032a._comment | 8 + doc/special_remotes/hook.mdwn | 109 + ..._6a74a25891974a28a8cb42b87cb53c26._comment | 32 + ..._ee7c43b93c5b787216334f019643f6a0._comment | 17 + ..._2593291795e732994862d08bf2ed467b._comment | 17 + ..._35d79b5ffa5a19056efcdc805070bc4b._comment | 18 + ..._6fbf1e963fa3ea4b2eb8ca5a3819762d._comment | 10 + ..._e0ab48d5333e5de85f016b097e6fdac1._comment | 12 + ..._cc2b1243c2c36e63241513bcaddfea67._comment | 10 + ..._bbae315233bda48eb04662dfd48cf1ae._comment | 30 + ..._037523d1994c702239ca96791156fe65._comment | 10 + doc/special_remotes/rsync.mdwn | 56 + ..._43e8fa3517c1f5935f02ad06fbed63dc._comment | 8 + ..._8cafc1a8b37e6fb056185ec058c0c3e8._comment | 8 + ..._9e180c397486989beab21699b8e8f103._comment | 16 + ..._25545dc0b53f09ae73b29899c8884b02._comment | 8 + ..._960a89b1ae7e3888ffba06baa963dc21._comment | 20 + ..._db84816c31239953dd21f23a8c557b43._comment | 15 + ..._ccaffa4aded9dab88c76a856b96ea5b9._comment | 9 + ..._e687b9482b177e1351c8c65ea617d3fa._comment | 8 + ..._e122979ea811d9ef835ba05bb936190f._comment | 10 + ..._d566113318d0aa7500d76ffe1bd46069._comment | 10 + ..._5dcf10a502b2d4feac46b620d43e9d00._comment | 8 + doc/special_remotes/tahoe.mdwn | 47 + doc/special_remotes/web.mdwn | 11 + ..._0bd570025f6cd551349ea88a4729ac8e._comment | 8 + ..._333141cc9ec6c26ffd19aa95303a91e3._comment | 8 + doc/special_remotes/webdav.mdwn | 42 + ..._2c087a132c2203ac20636800bf73dfa7._comment | 8 + ..._cde4fccaf551ba1eab8235ebf6654316._comment | 10 + ..._76423262fceeced32ab18fa38ed53bdb._comment | 15 + ..._2390020fa7daac8a6d3e8b713bd3b8e7._comment | 12 + ..._6b523eea78eae1d19fe2a9950ee33e3a._comment | 26 + ..._83fc4e7d9ba7a05c8500da659f561b8f._comment | 10 + ..._239367ad639c61ecdf87a89f7ac53efe._comment | 10 + ..._ffa52f7776cdc8caa28667b5eadae123._comment | 8 + ..._5b8cbdb5e9a1b90d748a5074997e1cd5._comment | 12 + ..._d3be3e588c3a2abb2025ceb82c18b0ef._comment | 10 + ..._6fa7e11331db5a943015bd5367eb3d73._comment | 12 + ..._2627b41f80c7511b27464e2040b128a8._comment | 8 + ..._b8f17efe524bb45a3e16705996df1265._comment | 8 + doc/special_remotes/xmpp.mdwn | 39 + ..._c7c2e2e81cb5b2b9a5272430c835dd39._comment | 10 + ..._05d9a67b9331656b4035399641cedb1b._comment | 22 + ..._568247938929a2934e8198fca80b7184._comment | 11 + ..._9fc3f512020b7eb2591d6b7b2e8de2d7._comment | 10 + ..._48ddbba1402d89acaea07cff747c48e0._comment | 28 + ..._59857879abaae22bde444a215e00bf18._comment | 14 + ..._583ee374bd34fcc9ae26c2fd690e8c47._comment | 73 + ..._8f0b5bba1271d031a67e7f0c175d67d5._comment | 8 + ..._ac7acbded03325b015959d82ae77faf1._comment | 10 + ..._81a9636a1e8a36a58185468a26f8633d._comment | 8 + ..._eda76b826491c96b1ce072aacf9d3adf._comment | 23 + doc/summary.mdwn | 11 + doc/sync.mdwn | 44 + ..._2cd8ab86f498d6f676f859b552f831eb._comment | 8 + ..._7683879f6982c0eb0aa39b66ff5a5ea9._comment | 10 + ..._2fea14fa314ddb7ab645a5cca5a95fd9._comment | 14 + ..._690f66be9cefe28844d8df653b7a0331._comment | 10 + ..._db342785a4dade30b5b75cb95031bed1._comment | 8 + ..._168e0ab10b4084e13df1a3058fa7e8a9._comment | 8 + ..._96096f994fc55f921f2b24b274f998f7._comment | 8 + ..._59681be5568f568f5c54eb0445163dd2._comment | 8 + ..._9301ff5e81d37475f594e74fbe32f24e._comment | 11 + ..._49560003da47490e4fabd4ab0089f2d7._comment | 8 + ..._cf29326408e62575085d1f980087c923._comment | 8 + ..._18c396c59907147bb2bf713e55392b6b._comment | 8 + ..._012e9d4468d0b88ee3c5dad3911c3606._comment | 10 + ..._6276e100d1341f1a0be368f54de0ae7b._comment | 8 + ..._b89161c82c05634d35f6b65bf8360a96._comment | 14 + ..._849883b7cc05bfcb01914d8737098010._comment | 18 + doc/templates/bare.tmpl | 1 + doc/templates/buglist.tmpl | 25 + doc/templates/bugtemplate.mdwn | 18 + doc/templates/walkthrough.tmpl | 2 + doc/testimonials.mdwn | 34 + ..._2bf439f7a3bc3d6fab91849017946182._comment | 8 + doc/thanks.mdwn | 372 + doc/tips.mdwn | 4 + ..._37____38____34____35___Haskell__33__.mdwn | 111 + ..._835a3608df3e9d044cabe822d0f3e7e4._comment | 27 + ..._080b30cba72a718e73ea715e259e1cfb._comment | 8 + doc/tips/Crude_Windows_Sync.mdwn | 35 + ...tralized_repository_behind_a_Firewall.mdwn | 59 + ..._78b9035234a690ca5a7c9f3cc78fa092._comment | 8 + .../Delay_Assistant_Startup_on_Login.mdwn | 13 + ..._c63917150527efab4b1106183b3aa7ef._comment | 8 + doc/tips/Git_annex_and_Calibre.mdwn | 120 + ...ly_annex_a_file_already_in_a_git_repo.mdwn | 19 + ..._7eaf73fb3355bd706ab18a43790b3c10._comment | 8 + ..._dac1a171204f30d7c906e878eb6bd461._comment | 45 + ..._b62ec0b848d2487d68d7032682622193._comment | 36 + ..._2423904e41a86cd1c6bc155d7b733642._comment | 9 + doc/tips/Internet_Archive_via_S3.mdwn | 85 + ..._d53a3848c20dce61867283fc03c2adaa._comment | 34 + ..._91c1472da27b00e5d682d22bc1ef04e0._comment | 10 + ..._e23cf781c532f80d47d52265f2b2c87e._comment | 8 + .../Shamir_secret_sharing_and_git-annex.mdwn | 21 + doc/tips/Synology_NAS_and_git_annex.mdwn | 59 + ..._ef7e19f1fd2005eb7cc74509ffb92766._comment | 9 + ...content_settings_for_my_android_phone.mdwn | 36 + ..._393d1636bb313530be383a075bd3440a._comment | 14 + ..._51a013213118660bdc06ff4d6c8110ba._comment | 12 + ...Git-annex_as_a_web_browsing_assistant.mdwn | 46 + ..._74167f9fff400f148916003468c77de4._comment | 8 + doc/tips/ZSH_completion.mdwn | 13 + doc/tips/assume-unstaged.mdwn | 31 + ..._44abd811ef79a85e557418e17a3927be._comment | 10 + ..._5b589f37cfc03bf7be33a51826cc4dba._comment | 13 + doc/tips/automatically_adding_metadata.mdwn | 24 + ..._ffc308cc6aedabbc55820db4f401e0fb._comment | 8 + ..._bd64a53914107bc000c887b4d4bdf6af._comment | 12 + ..._02e5314f827d17d482343e8f22c42fd9._comment | 10 + .../pre-commit-annex | 71 + ...tomatically_getting_files_on_checkout.mdwn | 15 + ...n_doing_fsck_on_large_special_remotes.mdwn | 2 + ..._e7c5c46112a2406b873d08bbf53c40d8._comment | 8 + ..._daf45ce29fed986fa9aa8b173760d0b7._comment | 14 + ..._72d222020af4a9c6c753eb1ee7e1f1cf._comment | 8 + ...sed_repository:_starting_from_nothing.mdwn | 71 + ..._b0d22822017646775869ce1292e676f4._comment | 8 + .../centralized_git_repository_tutorial.mdwn | 140 + ..._9072ebc0c61446d7b151fcfab616fea9._comment | 33 + ..._528e92b21f0551fde4adb956654953ae._comment | 8 + doc/tips/downloading_podcasts.mdwn | 79 + ..._4d4f6c22070b58918ee8d34c5e7290ad._comment | 8 + ..._d8d77048c7e2524968c188e1ad517873._comment | 24 + ..._0859317471b43c88744dd3df95c879f7._comment | 10 + ..._e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment | 18 + ..._05a3694052de36848fbbad6eeeada895._comment | 8 + ..._21028bed8858c2dae1ac9c2d014fd2a1._comment | 8 + ..._4869fb5c9f896acc477c44de06c36ca7._comment | 8 + ..._2e278ff200c1c15efd27c46a3e0aed40._comment | 9 + ..._382f2b970738d9b1af577955c3083e90._comment | 15 + ..._f76fc6835e5787b0156380bf09fd81ca._comment | 8 + ..._f04bc32a34baeeffcd691e9f7cce0230._comment | 13 + ..._65ebf3a3bbf0a2aebd2b69640b757e16._comment | 10 + ..._98a1dacc8d264ff31801e6c5c5f2612d._comment | 8 + ..._00cc7a2fb936d7ea3d5d3764a1637663._comment | 10 + ..._a9a98cad7358d16792853a2ee413fe6c._comment | 8 + ..._5a8068a5cb0fd864581157a3aa5d1113._comment | 10 + ..._e7072a9da30b4c4b4c526013144238d4._comment | 10 + ..._79b3f8d678ac9f67df4c0cd649657283._comment | 8 + ..._35106fee5458bdd5c21868fbc49d3616._comment | 10 + ..._ceb16498b7aadbf04a27acd5d6561d46._comment | 8 + ..._147397603f0b3fdb42ca387d1da7c5ef._comment | 8 + ..._6a26a6cc7683d38fae0f23c5a52d1e23._comment | 24 + doc/tips/dropboxannex.mdwn | 29 + doc/tips/emacs_integration.mdwn | 25 + doc/tips/file_manager_integration.mdwn | 119 + ..._0f82520f415b4715946358658e1799a8._comment | 8 + ..._9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment | 8 + doc/tips/finding_duplicate_files.mdwn | 21 + ..._2ed5aa8c632048b13e01d358883fa383._comment | 12 + ..._5efc6b6ee1dfec88512183e9679ca616._comment | 24 + ..._ddb477ca242ffeb21e0df394d8fdf5d2._comment | 8 + ..._900eafe0a781018ff44b35ac232e3ad3._comment | 8 + .../comment_3._comment | 39 + ..._1494143a74cc1e9fbe4720c14b73d42b._comment | 8 + ..._1a35ca360468bcb84a67ad8d62a2ef7d._comment | 8 + ..._a6e88c93b31f67c933523725ff61b287._comment | 16 + ..._347b0186755a809594bd42feda6363e2._comment | 10 + ..._3af51722da0980b724facb184f0f66e9._comment | 10 + ..._7b4b78a5cd253abfe4f6001049bf64f3._comment | 10 + doc/tips/flickrannex.mdwn | 50 + ..._50707f259abe5829ce075dfbecd5a4ba._comment | 13 + ..._ab5bcb025381b3da4d7c6dfd0c7310dd._comment | 46 + ..._90a331275d888221bc695003c8acbe46._comment | 58 + ..._1596e70dca71c853fd1d6fc9bde02b18._comment | 12 + ..._c728f10074d194efa8b2c60e97d275e7._comment | 12 + ..._d74c4fc7edf8e47f7482564ce0ef4d12._comment | 10 + ..._f53d0d5520e2835e9705bea4e75556f0._comment | 30 + ..._9ebba4d61140f6c2071e988c9328cf7e._comment | 14 + ..._4470dae270613dd8712623474bc80ab0._comment | 24 + ..._d395cdcf815cb430e374ff05c1a63ff4._comment | 17 + ..._8cf730097001ffe106f2c743edce9d0a._comment | 12 + ..._a80c8087c4e1562a4c98a24edc182e5a._comment | 12 + ..._94f84254c32cf0f7dd1441b7da5d2bc6._comment | 8 + ..._5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment | 9 + ...ncrypted_git_repositories_with_gcrypt.mdwn | 127 + ..._4440a80d64c60c7312d5c405d54e607a._comment | 15 + ..._28eb9d4ebf28ca310f9b357b1dad244a._comment | 30 + ..._b697b2ab10705b090a78e7717ec59b18._comment | 10 + ..._4e37146a870576f09f56d2e5ee784ed7._comment | 23 + ..._2044e821d841fcd37a51ae768fa88df2._comment | 12 + ..._5c54690586f2a781905ea4b25aa1147f._comment | 18 + ..._07feedb4348f8c31176cc744c19368a1._comment | 21 + ..._c2f873dffa015f1d72ad0c3921909316._comment | 8 + ..._f8a6e4415f4fe6da14f6a3b7334bc952._comment | 18 + ..._11b8e82d2a234f65b58b823e71c6d6a2._comment | 10 + ..._3e41948e1beffcf279bb05ef8e61cc07._comment | 16 + ..._4ce0b26b25b336f07b2e27246cdfba3e._comment | 16 + ..._49aa34d75d24a2066baa8a585bc9c2e9._comment | 14 + ..._3784e0c828cd60b6a9075c2d32d070cc._comment | 14 + doc/tips/googledriveannex.mdwn | 32 + ..._ce7f2b04e83cc02d9dabb712f266e5cc._comment | 9 + ..._c98c00e87bc921158c9c3698fd9f89c9._comment | 23 + ..._e7ba5620c0946874f0ae1287f99d1177._comment | 8 + ..._239091adaea6ae39fa9a4d9719667a98._comment | 41 + doc/tips/imapannex.mdwn | 25 + doc/tips/megaannex.mdwn | 29 + doc/tips/metadata_driven_views.mdwn | 152 + ..._1d6793701fd8a1a66bae04662cf853ce._comment | 12 + ..._13ae4e3668b693c0eefaca23b88515cf._comment | 9 + doc/tips/migrating_data_to_a_new_backend.mdwn | 16 + ...disconnected_directories_to_git_annex.mdwn | 77 + doc/tips/offline_archive_drives.mdwn | 69 + ..._3d4fdf42191a9d81434d00f51c3609ff._comment | 12 + ..._864c752aa8d064791a4b14dbbe2e6882._comment | 15 + ..._7be2ccaf70c9ecfc9a34384e0e31f490._comment | 10 + doc/tips/owncloudannex.mdwn | 28 + ..._129652308c3c499462828dcaf8e747a4._comment | 40 + ..._38604990368666f654d41891ba99ac61._comment | 15 + ..._1bfd290d00d6536da7d31818db46f8ec._comment | 87 + ..._492b6922a7c5bb5464fedb46b0c5303b._comment | 17 + ..._1d48ac08714fadcb06d874570d745bd8._comment | 16 + ..._65959f49a2f56bffd6fe48670c0c8d5a._comment | 8 + ..._7482002991672ef67836bae43b8d0be8._comment | 8 + doc/tips/powerful_file_matching.mdwn | 36 + doc/tips/recover_data_from_lost+found.mdwn | 19 + ..._f0901527a4f0faf0b1fd916d5b809314._comment | 9 + ..._ac405575058beeac992d07c55f7c53a8._comment | 8 + ...overing_from_a_corrupt_git_repository.mdwn | 17 + ..._f5827be97f78dbae113a5ba0c9ced896._comment | 8 + ..._e98df7275bb032308bb87e3607bdde32._comment | 8 + ..._11bece6dfac090edbcd783b266c482a3._comment | 8 + ..._86e99017f7585ac2f76753051214637e._comment | 8 + ..._c8953732ce353cdf0c4fb81ddc98c04a._comment | 8 + ..._d0da84df0241dc6ccf0aa0c7598917df._comment | 8 + ..._addf49556e4c33d55a41c393f519d0a4._comment | 10 + ..._505a2fc2b841fe8eb419801f923ef35f._comment | 8 + doc/tips/remote_webapp_setup.mdwn | 49 + ...e_or_dvcs-autosync_with_the_assistant.mdwn | 51 + ..._d1bd5d6b33951f6d11185bb4a8228269._comment | 8 + ..._54692ebf854ecbcc5314bb29c33ecc66._comment | 8 + ..._907e4032ca4a39adb846cf16dbf447dc._comment | 8 + ..._902d001ba86657ef0f8cca5b175f99ca._comment | 8 + ..._a1cf93f9b29658f0f26e9e0ae6057ee3._comment | 60 + ..._e10671908b58c554375787d0f76e2366._comment | 13 + ..._4114380f66b6376c851e93f6876d590b._comment | 8 + ..._6a5d6af107b297afd008b021f73d787b._comment | 8 + ..._74d57cf503a86d8f7ace2d769dbb58be._comment | 10 + ..._85765c0cfeb5b326c06cf60c98147cbf._comment | 21 + ..._082b5d90ffc836e7c86e40b63a75780d._comment | 8 + ...tup_a_public_repository_on_a_web_site.mdwn | 55 + ..._1d0fa6da33e401df1d7ff31979247fec._comment | 10 + ..._b98b761dee9d923153e3c288c1d987ee._comment | 11 + ..._a6698218f15c598c9b32e0af850133bf._comment | 12 + ...nnex_directory_between_multiple_users.mdwn | 39 + ..._01db8cf9dff016bd8e0498d36f325418._comment | 8 + doc/tips/skydriveannex.mdwn | 32 + ..._c3465b5587548dea56b80b32cd66d653._comment | 16 + ..._bf383481b2bbb962fbfe783b9f2f213a._comment | 8 + ..._1f747018b35ab8accd2bf0905e6ad926._comment | 8 + ..._8b9444006734262693f71e50a40eae1d._comment | 19 + ..._8b01dc6ca1082a8c24ff65fec9d759d8._comment | 8 + ..._1d220d96945d497f3a93b5d848eb3995._comment | 8 + ..._a7a3afdc7eed9a0eda48dcb57f1e87c6._comment | 12 + ..._7fcd9c6b5e2a3fc7b753eeac06164036._comment | 18 + ..._856eaa1b167033aede91a937099c7833._comment | 18 + ..._cfcf767a1bf07957b76d7f44ef8a9500._comment | 14 + doc/tips/untrusted_repositories.mdwn | 28 + doc/tips/using_Amazon_Glacier.mdwn | 75 + ..._ccee7f4f5a483a3650270b6e09ab7293._comment | 36 + ..._d34e05f9244d3a4fcec87b3c360adb4e._comment | 10 + ..._4c504fd22775afe36296cf54d3e04a8e._comment | 8 + ..._e6ac76b0c20285f4f96b3d0975e8ac66._comment | 21 + ..._7788890f58f714b0cdf1462c718ea536._comment | 8 + ..._0fbe528a57552622e8128196ad80c863._comment | 8 + doc/tips/using_Amazon_S3.mdwn | 37 + ..._666a26f95024760c99c627eed37b1966._comment | 8 + ..._f5a0883be7dbb421b584c6dc0165f1ef._comment | 8 + ..._32acba030c2ad252e2f7027075e4303e._comment | 8 + ..._92df5a9f923beafba55a1c455728112e._comment | 13 + doc/tips/using_Google_Cloud_Storage.mdwn | 9 + ..._c576182f39563ae68767391c4227a177._comment | 18 + ..._0843bfb776b8b6d5de4de7fda4489f34._comment | 15 + ..._9738f145014d8eae1f1aae7c39e71d31._comment | 12 + .../using_box.com_as_a_special_remote.mdwn | 71 + ..._be39f063e8a6155cc2eb71829e884a63._comment | 8 + ..._no_fixed_hostname_and_optimising_ssh.mdwn | 59 + ..._c0b7682a2b6f3078457b85683c825baf._comment | 10 + doc/tips/using_gitolite_with_git-annex.mdwn | 149 + ..._8767bc8014b459a3cd76f275fd4fa8d6._comment | 8 + ..._00715e0b47f09130e0e536e29f7b9258._comment | 31 + ..._7027ce60265b8f24c8ab54553e544068._comment | 8 + ..._75218b7409c0e281cb01c9b2791e8cdf._comment | 20 + ..._7d4d4515218d1259d32be3baeb5ee56e._comment | 13 + ..._dc6f21b5a3d5931c8d949a9753411b9e._comment | 29 + ..._8e5039e6655fc80dc863b6cdf44ef02a._comment | 15 + ..._9c40e1da8bb44f7207e802377f5cf923._comment | 11 + ..._f1a180d5cf65b7a870a13ddb4f76d00d._comment | 21 + ..._33c19097b6f2b48dfe09ec4c8d952d06._comment | 11 + ..._9a2a2a8eac9af97e0c984ad105763a73._comment | 15 + ..._c82af00db3dd74ee9bfe12668e76e57b._comment | 13 + ..._d2feaaf22d41413048dabf706d1b267e._comment | 8 + ..._d8efea4ab9576555fadbb47666ecefa9._comment | 8 + ..._807035f38509ccb9f93f1929ecd37417._comment | 8 + ..._eb81f824aadc97f098379c5f7e4fba4c._comment | 33 + ..._f688309532d2993630e9e72e87fb9c46._comment | 20 + ..._3e203e010a4df5bf03899f867718adc5._comment | 25 + ..._f8fd08b6ab47378ad88c87348057220d._comment | 10 + ..._8249772c142117f88e37975d058aa936._comment | 29 + ..._28418635a6ed7231b89e02211cd3c236._comment | 8 + doc/tips/using_the_SHA1_backend.mdwn | 11 + .../using_the_web_as_a_special_remote.mdwn | 109 + ..._321a41d611c6fe45e047af9c96c5176c._comment | 26 + ..._dfe9c8c49aadff80d2020288584e0390._comment | 10 + ..._ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment | 18 + ..._c1133a524989a940f1b5db588707157a._comment | 10 + ..._5ee9717e74ca2afed98e81fc0ea98a95._comment | 18 + ..._dceb15bd656e69eefa3ca975d9d642de._comment | 8 + ..._0bde977c62a53c90cb20491936bc399d._comment | 8 + .../visualizing_repositories_with_gource.mdwn | 22 + ..._01c5cd21375990c612b8f291904ddb3e._comment | 10 + .../screenshot.jpg | Bin 0 -> 78509 bytes ..._to_do_when_a_repository_is_corrupted.mdwn | 27 + ..._c3543190eae2af594f3e050057e80db6._comment | 8 + ..._025178c2b11affe2d42a87544b897dc8._comment | 8 + ..._9a6bae9c0326ecc7610f5415db20f49e._comment | 8 + ...what_to_do_when_you_lose_a_repository.mdwn | 19 + ..._cf19b8dc304dc37c26717174c4a98aa4._comment | 11 + ..._fa9ca81668f5faebf2f61b10f82c97d2._comment | 8 + ..._fdcfca8707e310ca7bb94d359adf8607._comment | 8 + ..._679eb9be0bfb9d48a2b96383c4816f62._comment | 10 + ..._4fb04b70d88ec93ff9ed4f884747d5d4._comment | 12 + ..._05db504cbff2ec2a6346bf43e57a3c25._comment | 8 + ..._4e6baa41bfee6edf2b17d4ade2909c7b._comment | 16 + ...nother_simple_disk_usage_like_utility.mdwn | 9 + ..._41b212bde8bc88d2a5dea93bd0dc75f1._comment | 9 + ..._73698913837bfd5a58cf15721211e43e._comment | 8 + doc/todo.mdwn | 4 + ...Versions_of_a_File_From_a_Direct_Repo.mdwn | 1 + ..._6f477af942aeb98683a56bcf0e819a38._comment | 11 + ..._45c22f596a18d5dc2331cfeef8c767fa._comment | 12 + ..._cbca264d86fe733b8106a4bf50c0c6ff._comment | 8 + ...y_to_pair_devices_like_bittorent_sync.mdwn | 9 + ..._d828bc374e50a49101c0b863f9b33080._comment | 8 + ..._a4badfc248be428e6426a936212cc896._comment | 8 + ..._0b04089d3d33fdb48eeb46bf168e9a3c._comment | 8 + ..._2bcab1b7998b4df08fca41b8d810f115._comment | 10 + ..._677e958c3f2effec7528b484aeb6478d._comment | 13 + ..._56e53803fdede895cba717e6b6e9a1bb._comment | 23 + ...4___shortcut___34__Add_to_Annex__34__.mdwn | 1 + doc/todo/Bittorrent-like_features.mdwn | 47 + ..._f4c110ef35ebf4fd89f06edf2c4f0c48._comment | 13 + ..._83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment | 8 + ..._84f149b30de1562593623aa23dc0396c._comment | 10 + ..._7c54c83e582c0d4848aaf3d70e312707._comment | 10 + ..._194dd0e8404ea72af9fb6ff34b994998._comment | 20 + ..._489505da4143fb1c2bf21e7af695cdef._comment | 9 + ...rive__39___repo_even_if_set_as_client.mdwn | 22 + ..._25eb2d7d0a9cdd1c55df0cec68472723._comment | 10 + ..._9e9b96e5113a50533251e946c2560d81._comment | 17 + ..._6b091198ddd6ed709b076df1296aeb77._comment | 11 + ..._118b588685b535cca4c02eb6ef297c67._comment | 21 + ..._5cead277493e1c020e16be6f9245fe33._comment | 12 + ..._0f135f97c2808dce094628dc6608e617._comment | 8 + ..._1d6f47f9e6cf935f19d68af6d5aa92fa._comment | 10 + ..._c5758fdb32348b9cd804ff17d27864e1._comment | 16 + ..._3f0bfc5a79aa59ac76a6968aacda6655._comment | 10 + ...Chunks_support_in_all_special_remotes.mdwn | 5 + ..._d12604dbeb42bbb6850425d237cb01e7._comment | 8 + doc/todo/Deleting_Unused_Files_by_Age.mdwn | 13 + ...o-merge_for_manual__44___local_merges.mdwn | 9 + ...71__git_annex_watch__187___is_running.mdwn | 5 + ..._e5f2630591ffa7758ca4250a061a8589._comment | 12 + ..._f8a5cc905d5b06bdbb1a778ab866a28c._comment | 44 + ..._626c629654508d0d948ece849d43ed86._comment | 8 + ...prove_direct_mode_using_copy_on_write.mdwn | 42 + .../LIst_of_Available_Remotes_in_Webapp.mdwn | 1 + ..._23fe2f3cd44c4357a385452dcd5eedef._comment | 10 + ...___47__ssh__47__git-annex__47__config.mdwn | 9 + ..._284c806e83a32af81b02aea7c7bc285a._comment | 10 + ..._1f55ad6b39906458779b2d604b003ffe._comment | 10 + ..._b00dce2374aac6968317d05d23bcfaf7._comment | 8 + ..._743d0b077110c5cac1e2f47187b75333._comment | 10 + ...al_remote_suggeston_-_clean_directory.mdwn | 23 + ..._4829c2a2302b4b9611deddfedfbaa944._comment | 10 + ..._4d81941fe53881eebff97109a07ba2f4._comment | 8 + ..._660a5b764ad42468154b2bb94f8ec004._comment | 8 + ..._eed178ce4bc4d2b3f08a1e3d3d62c086._comment | 12 + ..._1dae745cff1c0a38232d033dcc542ac4._comment | 16 + ..._8d6c791e5e2daec7b25828f6884a67c6._comment | 16 + ..._92ef2d4a7ed47000fda02732b4794dc0._comment | 10 + ..._78fb5cdd61220ffcf0ae1eaf266985ec._comment | 28 + ..._21712dfee4f37232c34eddbce2427691._comment | 11 + ..._0ba57952532d5ef1f2bbfb163faa3b2f._comment | 35 + doc/todo/Not_working_on_Android-x86.mdwn | 19 + ..._5eec4d7530c9df68f1bd1b1ca7021ef5._comment | 14 + ..._e5c4c99cb0675ad69bf8d7796be23c8e._comment | 12 + ..._6b609af60bf1c477139e40eba5cb0c4e._comment | 10 + ..._all_annexes_watched_by_the_assistant.mdwn | 11 + doc/todo/Recovering_from_a_bad_sync.mdwn | 31 + ..._6f5f518a3190534b737203787149ef3c._comment | 10 + ..._e494df56dcede4d14bcaa4cdbf3da4f5._comment | 10 + ..._4d4904bcbf97401c7c11338f32577f96._comment | 14 + ...ive_addurl_simlar_to_wget_--recursive.mdwn | 7 + ..._4ecd9ddba1b63b571555ec9bef18e2d8._comment | 8 + doc/todo/Show_repo_type_in_repo_list.mdwn | 1 + ..._ac6eb1072ef902a094b79dd8e0917c4d._comment | 10 + ..._6979c487f707a724a048d20e2e5744e6._comment | 14 + ..._529254a6cc20de7259d60a3cbc5ccaf7._comment | 8 + ...ow_transfer_for_a_lot_of_small_files..mdwn | 20 + .../Time_Stamping_of_Events_in_Webapp.mdwn | 3 + ...Use_MediaScannerConnection_on_Android.mdwn | 7 + ...g_site_for_files_with_obfuscated_URLs.mdwn | 7 + ..._1a1f34f4f389267d67e79409c0ca8b1d._comment | 9 + ..._735afa6f87a93cdf333c17da32010620._comment | 8 + doc/todo/Views_Demo.mdwn | 15 + ..._d7c83a0e9a83e4a05aa74a34a7e1cf19._comment | 8 + ...ional_environment_variables_for_hooks.mdwn | 14 + ..._d82cbbb478a81a651fbe6cb8b71c1192._comment | 8 + ...disable_auto-repair_for_the_assistant.mdwn | 3 + ..._3274820a0d1f10c505f15cd29a37b95a._comment | 12 + ..._2cf5aef3f1d340c4ed6249ef94c1b607._comment | 8 + ..._6c53d82e62b2d269a941ba967d05adf5._comment | 8 + ..._fix_wrong_UUID__47__duplicate_remote.mdwn | 7 + ...dd__187___for_symlinks_in_direct_mode.mdwn | 8 + ..._6c6e192bc0f70a386cd4275f98e1bd6f._comment | 8 + ..._8e22cfdbeb2c841870a623cf4c7baf60._comment | 10 + ...anch_to_applicable_git-annex_commands.mdwn | 2 + ..._3e0a1d1c41f317514dfc496f2274ad1c._comment | 10 + .../allow_removing_jabber_configuration.mdwn | 5 + ...epo_via_an_ssh_alias_or_an_ip_address.mdwn | 50 + ..._6b71a390fd16f593216793aec590d9a8._comment | 8 + .../assistant_parallel_file_transfers.mdwn | 15 + ...nches_upon___34__git_annex_sync__34__.mdwn | 16 + doc/todo/build_a_user_guide.mdwn | 3 + doc/todo/cache_key_info.mdwn | 37 + ..._578df1b3b2cbfdc4aa1805378f35dc48._comment | 11 + .../checksum_verification_on_transfer.mdwn | 7 + ..._30f77e631608b9751f9032f97d58cc30._comment | 17 + .../clear_file_names_in_special_remotes.mdwn | 13 + ..._630f17c9a7ce9a77d5d5867a6e0c799b._comment | 8 + ..._823c279683ac3f39c921be3fcbf6bfe2._comment | 10 + ..._4704e465025b543e47c18d565abd2747._comment | 8 + doc/todo/commit_in_direct_mode.mdwn | 9 + doc/todo/ctrl_c_handling.mdwn | 5 + ..._3addbe33817db5de836c014287b14c07._comment | 8 + ..._cc2776dc4805421180edcdf96a89fcaa._comment | 8 + ..._8d7d357368987f5d5d59b4d8d99a0e06._comment | 8 + doc/todo/custom_f-droid_repo.mdwn | 3 + ..._d2bdc001584d4b5f925390910ec1ef73._comment | 10 + ..._20eebe13b76d5279a3d09b346b65ff6e._comment | 9 + ..._5a79abb8b1dd12426e111e733fa6493b._comment | 8 + ..._55f05624f0e939f7b8d0c505285e5690._comment | 11 + ..._de4229f04daf48a153e2f44f57a05a3b._comment | 11 + ...o_not_bug_me_about_intermediate_files.mdwn | 7 + ...ard_groups_more_extensively_in_the_UI.mdwn | 14 + doc/todo/done.mdwn | 4 + ...erent_port_has_been_specified_already.mdwn | 2 + doc/todo/fast_migrate.mdwn | 16 + ...ce_checking_for_local_special_remotes.mdwn | 4 + ..._47c254cec58cbbb3ea84c93ef8282f01._comment | 8 + doc/todo/git-annex_ignores_GIT__95__SSH.mdwn | 39 + ..._958dd21d7e981232f03b4516521ac226._comment | 10 + ..._319a7e8122e7bc25d9399ba463a16158._comment | 22 + ..._cc1936f18721a912bb77903be6c4a45f._comment | 8 + ...0__file__62___should_verify_file_hash.mdwn | 34 + ..._650e01a04104120ef1db4ff16fedc4f1._comment | 16 + doc/todo/hidden_files.mdwn | 30 + ..._123__itemdate__125___with_--template.mdwn | 5 + ..._62752c760fc12eca0c34d67d58753d00._comment | 10 + ..._21672360060f48bc2eacfa535ff4c94d._comment | 11 + ..._for_spideroak_as_archive__47__backup.mdwn | 9 + ..._a47ea814f6d7727bbd0eeca6d1fd3219._comment | 10 + doc/todo/keep_annexed_files_for_a_while.mdwn | 8 + doc/todo/notifications.mdwn | 3 + doc/todo/openwrt_package.mdwn | 6 + ..._100d76109e04bc43979775d71b4152ac._comment | 12 + ..._2cb7dd4c0cc4413a4588b13cf7700de2._comment | 9 + ..._5ba8a325a683ff543d81a366c873070d._comment | 8 + doc/todo/optimise_git-annex_merge.mdwn | 23 + doc/todo/parallel_possibilities.mdwn | 13 + ..._d8e34fc2bc4e5cf761574608f970d496._comment | 8 + ..._adb76f06a7997abe4559d3169a3181c3._comment | 12 + ..._145fb974f45da99b7d4b117a3699cccf._comment | 12 + doc/todo/read-only_removable_drives.mdwn | 7 + ..._979455e3694ae2403134ed6fa2add2fa._comment | 21 + doc/todo/redundancy_stats_in_status.mdwn | 23 + ..._9f1c10f8cea4fa60a99cbcc8306dd5de._comment | 10 + ..._686ced0684d10511caf07953c64cd5b6._comment | 10 + doc/todo/required_content.mdwn | 23 + ..._42620a3c958666be2a0d5f5b8eadf7b4._comment | 23 + ..._132ec6378db63af6281569cf5748b9d3._comment | 14 + ..._b16a8e8b45ceee887c8c0167b7859654._comment | 8 + doc/todo/resuming_encrypted_uploads.mdwn | 22 + ..._1832a6fb78e8ad7c838582f46731ac3b._comment | 8 + ..._2ecc8e782f49e90ed1549e9179eb1a1e._comment | 8 + ...itory_mode_not_supported_by_git-annex.mdwn | 7 + doc/todo/smudge.mdwn | 162 + ..._4ea616bcdbc9e9a6fae9f2e2795c31c9._comment | 8 + ..._e04b32caa0d2b4c577cdaf382a3ff7f6._comment | 12 + ..._4e7c25fe24a1e71f58a8354fa64f41c2._comment | 10 + doc/todo/ssh_special_remote.mdwn | 44 + doc/todo/stream_feature__63__.mdwn | 23 + doc/todo/support_S3_multipart_uploads.mdwn | 14 + ...my_local_git-annex_from_a_dump_remote.mdwn | 6 + ..._81d63854f89f00855cda5ace0fc8262a._comment | 14 + ..._66822b72b1450e79e8edd0c6c21d5aa6._comment | 14 + ..._b9f73375e2c732e798495f8ee6970c7c._comment | 14 + doc/todo/tahoe_lfs_for_reals.mdwn | 23 + ..._0a4793ce6a867638f6e510e71dd4bb44._comment | 10 + ..._80b9e848edfdc7be21baab7d0cef0e3a._comment | 13 + doc/todo/union_mounting.mdwn | 10 + ..._cb08435812dd7766de26199c73f38e8b._comment | 8 + ..._240b1736f6bd4fbf87c372d3a46e661b._comment | 9 + ..._cf0a0d4fbd929f24f7056115b2acb7de._comment | 8 + .../unwanted_repository_version_upgrades.mdwn | 25 + ..._48f71865b65db4574a10e5c32ee22197._comment | 12 + ..._preferred___40__wanted__41___content.mdwn | 12 + doc/todo/view_git_annex_log_in_webapp.mdwn | 5 + ..._945054441d93423b2c7b81712b364a3c._comment | 8 + ..._0f434dfe80e90951870218bc1b76c374._comment | 12 + ...h_locked_down_git-annex-shell_account.mdwn | 7 + doc/todo/windows_git-annex_service.mdwn | 30 + ..._c3af14453e99dae5425deaa26ca7310e._comment | 14 + ..._e2dda1037cc85f03613f2774c139ad56._comment | 10 + ..._249a48a241f14f32dab49f381d2de3b3._comment | 8 + ..._d3d91ddc00bc275455022d86b779b148._comment | 10 + ..._59fbe4d07cdbeb786bae792f9c709ddd._comment | 10 + ..._f1d254fe85b0e5cbc7edf9096af4f942._comment | 27 + ..._79fc0ff98c5bba2ed616e52e5a58e28f._comment | 8 + ..._7d5fdac0084c4742967879f5f0f9fccf._comment | 8 + ..._8f10491f8c0a151284e6d81a83eab212._comment | 12 + ..._fcd34607116183cc1a764fb307eabe0a._comment | 10 + ..._51800fd83cd979b021eabdd4c44cfd61._comment | 13 + ..._6a6424f23772e57f1adb1807ca8b93fa._comment | 14 + ..._62a1a33c2aaf4b0b8a0149ec526907d7._comment | 16 + ..._3a408492107ca6f120b631ce8c41faef._comment | 23 + ..._c6cbc8fe9218f90c661cd1026658c939._comment | 8 + ..._ca245781a37db5546da3f7204adbeebb._comment | 17 + doc/todo/windows_support.mdwn | 121 + ..._394127e34e07ab3dc0e7b94ee6898866._comment | 8 + ..._c91eb7da8ee05064a5bc4a6e2203314b._comment | 8 + ..._3cc26ad8101a22e95a8c60cf0c4dedcc._comment | 10 + ..._8acae818ce468967499050bbe3c532ea._comment | 12 + ..._bd0a12f4c9b884ab8a06082842381a01._comment | 8 + ..._ad06b98b2ddac866ffee334e41fee6a8._comment | 8 + ..._444fc7251f57db241b6e80abae41851c._comment | 10 + ..._34f1f60b570c389bb1e741b990064a7e._comment | 8 + ..._a5ca56c487257434650420acfa60e39f._comment | 8 + ..._61214de7d967740d42905f3823ce2f65._comment | 12 + ..._259a0b1a6f4d8d1944173380adc5e7c8._comment | 8 + ..._--maxdepth_option_for_git_annex_find.mdwn | 22 + .../wishlist:_Add_--byte-limit_option.mdwn | 14 + ...Advanced_settings_for_xmpp_and_webdav.mdwn | 7 + ..._11c7444ab4988c60732af505b52bde3c._comment | 20 + ...wishlist:_Freeing_X_space_on_remote_Y.mdwn | 1 + ...:_Option_to_specify_max_transfer_rate.mdwn | 3 + ..._4fd870e14b5b70c8a6ade41406294387._comment | 10 + ..._dd854f297ad6a94b54be9f3edfd0f766._comment | 8 + ..._a8b7e90a473d5937807cc7eb456efe33._comment | 10 + ...st:_Restore_s3_files_moved_to_Glacier.mdwn | 7 + ..._eb934756cb2af7fa13ad3b5fad7f85b2._comment | 9 + ...___annex_get_for_centralized_use_case.mdwn | 14 + ..._5c8812973cf91b046e7fc44d7e86c78e._comment | 14 + ..._f36b6a5b128423211aac91a252ecf85f._comment | 18 + ..._ad1569b2405acacd2e37f42b82f24c88._comment | 10 + ..._8aba90150fe178ce9712ad951628f3d6._comment | 8 + ..._6f42d240e0021f4dfa37146bea3f5d7e._comment | 16 + ..._5fda455febf728b079f26fe42bf7bcab._comment | 16 + ..._f1052ab997f1a2cccbabfd1533fc0a59._comment | 8 + ..._07804647b6023436878756bd97a23f32._comment | 8 + ..._fdc883d3963de8072794f3189742e4e3._comment | 10 + ...:___39__get__39___queue_and_schedule..mdwn | 30 + ...__whereis__39___support_in_the_webapp.mdwn | 4 + ...___96__git_annex_drop_--relaxed__96__.mdwn | 5 + ..._c83a6cddd0ce222205a149cfa41ca395._comment | 10 + ..._353fbc2bcc40cb8c9af42907a34c6e5a._comment | 11 + ..._3e830035df580601f038ce3a7003c39d._comment | 63 + ..._e5516689bc128c061dcd66649dc69584._comment | 10 + ..._be740e4b06d9130ae6afc5783da3c0e0._comment | 14 + ..._79d115f95cec46bb51e7fba078524db1._comment | 17 + ...shlist:___96__git_annex_sync_-m__96__.mdwn | 10 + ..._annex_sync__96___without_auto-commit.mdwn | 5 + ..._fff7cdff9e4bc988139152a799b65c99._comment | 8 + ..._b8dd92d7710a9d194312058e53c38d21._comment | 10 + ..._206e319f6d7c6b0d1f05af2475a8b335._comment | 8 + ...hlist:_add_--symlink_option_to_import.mdwn | 1 + ..._d5d853142d401b95577567e3eb43495e._comment | 8 + ...file_samples_for_assistant_and_webapp.mdwn | 6 + ..._b89e90f9a70748c95aaf81740a40b76e._comment | 8 + ..._d64361380cb18b98ddb43ada1c9f540a._comment | 8 + ...shlist:_allow_custom_S3_url_in_webapp.mdwn | 3 + ..._3d1ea5579a6ad0c0efde58dca11c10aa._comment | 10 + ..._f96bb81fde4185368dc6ea5a5aed87da._comment | 10 + ...tracking_the_sources_of_the_downloads.mdwn | 28 + ..._36ae3c75053d5ec278b5e6eb2084d57a._comment | 8 + ..._be8eb800523db8cf7a2c68a28fbf5ea5._comment | 8 + ..._d9f725de41a8572c85e4c6d9b4bcc927._comment | 8 + ..._f52492e4cc6f965515800bd1c0e05c90._comment | 10 + ..._5b36656fc5fa124e763f06711d9da32b._comment | 10 + ..._285215a4466806baf85b8606f680494a._comment | 12 + ..._15bf62e46db4b84ed3156f550f03de42._comment | 12 + ...iles_configuration_in_webapp_and_sync.mdwn | 1 + ..._db632de391ce9fce42af51a770ed3aeb._comment | 10 + ..._4a0931d9884054d764fde315d4fe4851._comment | 14 + ...nnex.largefiles_support_for_mimetypes.mdwn | 1 + ..._304431bb62b5b8a64edc37a11bbaff59._comment | 8 + ...from_remote_with_the_least_free_space.mdwn | 1 + ..._6813fdc7ecc98765a5d35d34163a1712._comment | 8 + ..._21a249cedca1ceb80d10784004735524._comment | 8 + .../wishlist:_derived_content_support.mdwn | 8 + .../wishlist:_disable_automatic_commits.mdwn | 36 + ...splay_status_of_remotes_in_the_webapp.mdwn | 1 + .../wishlist:_do_not_import_new_files.mdwn | 7 + ..._b41c214599d6601257a9d824cebbffcc._comment | 14 + ..._7b26171458baaf5c0057276d2d97e14c._comment | 8 + ..._6f80ce6cee4519d4f69193d5086e194a._comment | 20 + ..._22a7a03c30174e42e6d8e639e31e1d34._comment | 12 + ..._4294e92e2f4efb9dd10b280f5c9843f7._comment | 10 + ...t:_do_round_robin_downloading_of_data.mdwn | 5 + ..._460335b0e59ad03871c524f1fe812357._comment | 8 + ...it_remote_on_hosting_site_from_webapp.mdwn | 1 + .../wishlist:_generic_annex.cost-command.mdwn | 17 + doc/todo/wishlist:_git_annex_diff.mdwn | 9 + ..._16ccf2e1036d9e1a913db81988731b5a._comment | 8 + ..._info_._also_return_numcopies_setting.mdwn | 1 + doc/todo/wishlist:_git_annex_info_UUID.mdwn | 8 + ..._d0d40bfdafed47e9e8ef2f4cd5c8576f._comment | 10 + .../comment_2._comment | 8 + doc/todo/wishlist:_history_of_operations.mdwn | 8 + ..._f9a77ce83c6f39b6272d5c577ffbb9f9._comment | 8 + ...it_annex_reinject_work_in_direct_mode.mdwn | 21 + ...rtial_files_available_during_transfer.mdwn | 18 + ..._8b1cfae6f2b61929a9c6f48ae63c921d._comment | 12 + ..._1304a721da6f5133fdfa1dac507f1ecb._comment | 10 + ...re_info_in_commit_messages_in_general.mdwn | 8 + ...rd_commit_message_of___96__sync__96__.mdwn | 3 + ..._b9c241cf94a35aa6a45f4d44334694b0._comment | 8 + ...o_the_end_of_the_queue_when_one_fails.mdwn | 7 + ..._82ee9de610a0ac55cd1c27c211079e5b._comment | 10 + ..._bea55156bd32cf9e6dd9b946ba1bb8c1._comment | 10 + ...int_more_info_with___39__unused__39__.mdwn | 37 + ...ishlist:_pack_metadata_in_direct_mode.mdwn | 3 + ..._1a550d6977a255b789337c3d1602db04._comment | 10 + ..._3cc9c69d33c658058daea9cb5e4ab669._comment | 10 + doc/todo/wishlist:_perform_fsck_remotely.mdwn | 39 + ..._db92311dcdb1ef0ab0413f83e191c70c._comment | 15 + ..._2f0dbaf143d94290bfbebb6869eb7241._comment | 12 + ..._5ec2e0e248dfd4ca46aef89cc5658d18._comment | 8 + ...t_locations_for_files_in_rsync_remote.mdwn | 6 + ...ve_directory_remote_setup__47__addurl.mdwn | 7 + ..._b79976afc2242791523e63831f30af71._comment | 12 + ..._1741d2392006a9af9cfd1f3b847600b9._comment | 9 + ...ores___40__gnunet__44___freenet__41__.mdwn | 26 + ..._e2c2047e7401cb95a82ffb686a732859._comment | 8 + ..._472b576afdb169b233edd01adcb2123d._comment | 8 + ..._b4ff519ece76c6c3fb29b981320e2e1c._comment | 10 + .../wishlist:_special_remote_Ubuntu_One.mdwn | 1 + ..._ab0c761030bc55e8fb75d1b344bb98b9._comment | 8 + ..._17e948acb1e29793cf172cd6def4160b._comment | 8 + doc/todo/wishlist:_swift_backend.mdwn | 5 + ..._e6efbb35f61ee521b473a92674036788._comment | 8 + ..._5d8c83b0485112e98367b7abaab3f4e3._comment | 8 + ..._bf8625b909c3a7321cae40e6f145e874._comment | 8 + ..._4d97d12ddd99834788e94648c8eebef9._comment | 10 + ..._1568f726f91d4589aef7ca9fcc3c957d._comment | 8 + ...ist:_traffic_accounting_for_git-annex.mdwn | 3 + ..._unify_directory_scheme_for_the_store.mdwn | 20 + ..._44da58beaaab359ecaba7fb905ca4ae1._comment | 10 + ..._bc698c501ecdb56df57171f4f3bb831a._comment | 16 + ..._e555d0dbbaa05528806905c6a940724b._comment | 8 + ...hlist:_use_hardlinks_for_local_clones.mdwn | 9 + ..._85064fafe472a5bd395d60ce8f7acb56._comment | 12 + doc/todo/wishlist:alias_system.mdwn | 1 + ..._5afad4b92f9a449d4a82a94ad31feec2._comment | 8 + ..._stamps_to_annex_log_popups_in_webapp.mdwn | 1 + ..._ec90432a7d46383071401b05243d621f._comment | 8 + ..._option_to_install__SSH_key_on_remote.mdwn | 9 + ..._13737dc99aa877b309f7ebe44ecbafee._comment | 16 + ..._06230669218541ac392d674bedd43176._comment | 43 + ..._002afd775b82a0ced609c8305803a6c2._comment | 22 + ..._9e8fdc41fdefcb8be0d6bae7cd4a04a9._comment | 59 + 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 + ..._20f9b7b75786075de666b2146dc13a60._comment | 12 + doc/upgrades/gcrypt.mdwn | 25 + ..._606c1527735996ae671f78948e4ad84b._comment | 8 + doc/use_case/Alice.mdwn | 24 + doc/use_case/Bob.mdwn | 25 + doc/users.mdwn | 9 + doc/users/anarcat.mdwn | 55 + 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 | 13 + doc/videos.mdwn | 8 + doc/videos/FOSDEM2012.mdwn | 7 + doc/videos/LCA2013.mdwn | 8 + doc/videos/git-annex_assistant_archiving.mdwn | 5 + .../git-annex_assistant_introduction.mdwn | 5 + ..._f42ad4183c2c28319d3705a82fceb82f._comment | 15 + ..._b62f4eeeac1138570f7cb8c98d41c2cb._comment | 12 + doc/videos/git-annex_assistant_lan.mdwn | 6 + ..._df8c8b6d9d63fbf5462b225edbb23c82._comment | 8 + ..._d4e3122da9c9e27fbe872e09fcde762b._comment | 10 + ..._d43ee0a335c2f010b437cf28437455c2._comment | 8 + ..._c710e27db41311b157d8caaafc32dc7e._comment | 8 + .../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 | 26 + doc/walkthrough/adding_a_remote.mdwn | 19 + ..._0a59355bd33a796aec97173607e6adc9._comment | 8 + ..._f8cd79ef1593a8181a7f1086a87713e8._comment | 9 + ..._60691af4400521b5a8c8d75efe3b44cb._comment | 9 + ..._6f7cf5c330272c96b3abeb6612075c9d._comment | 10 + doc/walkthrough/adding_files.mdwn | 12 + .../automatically_managing_content.mdwn | 45 + doc/walkthrough/backups.mdwn | 27 + ..._d0244791d2abbf29553546a6a6568a0f._comment | 10 + doc/walkthrough/creating_a_repository.mdwn | 6 + .../fsck:_verifying_your_data.mdwn | 16 + .../fsck:_when_things_go_wrong.mdwn | 13 + doc/walkthrough/getting_file_content.mdwn | 12 + doc/walkthrough/modifying_annexed_files.mdwn | 44 + ..._624b4a0b521b553d68ab6049f7dbaf8c._comment | 14 + ..._b000622304535d32b69db17d51156b21._comment | 10 + doc/walkthrough/more.mdwn | 3 + ...ing_file_content_between_repositories.mdwn | 13 + ..._4c30ade91fc7113a95960aa3bd1d5427._comment | 19 + ..._7d90e1e150e7524ba31687108fcc38d6._comment | 10 + ..._558d80384434207b9cfc033763863de3._comment | 12 + ..._a2f343eceed9e9fba1670f21e0fc6af4._comment | 8 + ...e:_When_git-annex_seems_to_skip_files.mdwn | 27 + doc/walkthrough/removing_files.mdwn | 17 + ..._cb65e7c510b75be1c51f655b058667c6._comment | 8 + ..._64709ea4558915edd5c8ca4486965b07._comment | 8 + .../removing_files:_When_things_go_wrong.mdwn | 24 + doc/walkthrough/renaming_files.mdwn | 13 + doc/walkthrough/syncing.mdwn | 27 + ...nsferring_files:_When_things_go_wrong.mdwn | 17 + doc/walkthrough/unused_data.mdwn | 35 + ..._684b7b652d3a8ec04f32129c5528f1ab._comment | 22 + doc/walkthrough/using_bup.mdwn | 37 + doc/walkthrough/using_ddar.mdwn | 32 + doc/walkthrough/using_ssh_remotes.mdwn | 33 + ..._98e97c4d7fbbcd449eddf683967a71d6._comment | 8 + ..._f2775a151ed50caba27057bd9c38bae2._comment | 13 + ..._a8bc6110128431ca2a8624ddc75ea364._comment | 10 + ..._365db5820d96d5daa62c19fd76fcdf1e._comment | 13 + ..._451fd0c6a25ee61ef137e8e5be0c286b._comment | 16 + ..._b2f15a46620385da26d5fe8f11ebfc1a._comment | 15 + ..._433ccc87fbb0a13e32d59d77f0b4e56c._comment | 8 + ..._a9805c7965da0b88a1c9f7f207c450a1._comment | 18 + ..._9d5c12c056892b706cf100ea01866685._comment | 12 + ..._725e7dbb2d0a74a035127cb01ee0442c._comment | 16 + ..._8448e55026d2c2b50d8da41707686bea._comment | 16 + ..._61833299a9878f23ac57598fa6da8839._comment | 23 + doc/walkthrough/using_tags_and_branches.mdwn | 14 + ghci | 4 + git-annex.cabal | 232 + git-annex.hs | 85 + git-union-merge.hs | 48 + standalone/android/Makefile | 170 + standalone/android/abiversion | 1 + standalone/android/buildchroot | 27 + standalone/android/buildchroot-inchroot | 32 + .../android/buildchroot-inchroot-asuser | 44 + standalone/android/busybox_config | 997 ++ standalone/android/clean-haskell-packages | 6 + standalone/android/dropbear.patch | 55 + standalone/android/git.patch | 54 + ....3.7-0001-support-Android-cert-store.patch | 37 + .../haskell-patches/comonad_cross-build.patch | 25 + .../crypto-numbers_build-fix.patch | 227 + ...ive_0.4.4_0001-fixes-for-cross-build.patch | 25 + ....dns1-command-instead-of-resolv.conf.patch | 66 + .../haskell-patches/entropy_cross-build.patch | 25 + ...1.4-0001-statically-link-with-gnutls.patch | 43 + .../gsasl_0.3.5-0001-link-with-libgsasl.patch | 25 + ...1.2.11_0001-build-without-IPv6-stuff.patch | 47 + ...ge-javascript_fix-build-with-new-ghc.patch | 25 + ....BSD-symbols-not-available-in-bionic.patch | 157 + ....0_0003-configure-misdetects-accept4.patch | 34 + ...-getprotobyname-hack-for-tcp-and-udp.patch | 28 + ...k_2.4.1.0_0005-no-NODELAY-on-android.patch | 25 + ...work_2.5.0.0_0001-android-port-fixes.patch | 161 + ...opt-stuff-to-allow-cross-compilation.patch | 25 + .../socks_0.4.2_0001-remove-IPv6-stuff.patch | 135 + .../stm-chans_cross-build.patch | 25 + .../system-filepath_cross-build.patch | 25 + .../unbounded-delays_crossbuild.patch | 25 + .../unix-time_hack-for-Bionic.patch | 69 + ...out-v1-uuid-which-needs-network-info.patch | 79 + ...09-system_support-Android-cert-store.patch | 36 + ....5.4.0_0001-hack-to-build-on-Android.patch | 35 + .../icons/drawable-hdpi/ic_launcher.png | Bin 0 -> 2612 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 1310 bytes .../icons/drawable-ldpi/ic_launcher.png | Bin 0 -> 1279 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 682 bytes .../icons/drawable-mdpi/ic_launcher.png | Bin 0 -> 1768 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 946 bytes .../icons/drawable-xhdpi/ic_launcher.png | Bin 0 -> 3396 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 1837 bytes .../android/icons/drawable/ic_launcher.png | 1 + .../ic_stat_service_notification_icon.png | 1 + standalone/android/install-haskell-packages | 146 + standalone/android/openssh.config.h | 249 + standalone/android/openssh.patch | 217 + standalone/android/rsync.patch | 40 + standalone/android/runshell | 133 + standalone/android/start.c | 64 + standalone/android/term.patch | 598 ++ standalone/licences.gz | Bin 0 -> 60598 bytes .../network_disable_accept4.patch | 26 + standalone/linux/install-haskell-packages | 102 + 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 | 105 + standalone/no-th/evilsplicer-headers.hs | 38 + .../DAV_build-without-TH.patch | 415 + .../haskell-patches/aeson_remove-TH.patch | 40 + .../file-embed_remove-TH.patch | 150 + .../generic-deriving_remove-TH.patch | 394 + .../no-th/haskell-patches/lens_no-TH.patch | 230 + .../monad-logger_remove-TH.patch | 27 + .../persistent-template_stub-out.patch | 25 + .../persistent_1.1.5.1_0001-disable-TH.patch | 41 + .../process-conduit_avoid-TH.patch | 24 + ...profunctors_3.3-0001-fix-cross-build.patch | 26 + .../reflection_remove-TH.patch | 59 + .../shakespeare_remove-TH.patch | 1314 +++ .../skein_hardcode_little-endian.patch | 26 + .../vector_hack-to-build-with-new-ghc.patch | 24 + .../wai-app-static_deal-with-TH.patch | 82 + .../xml-hamlet_remove_TH.patch | 108 + .../yesod-auth_don-t-really-build.patch | 34 + .../yesod-core_expand_TH.patch | 771 ++ .../yesod-form_spliced-TH.patch | 1833 ++++ ...yesod-persistent_do-not-really-build.patch | 33 + .../yesod-routes_remove-TH.patch | 170 + .../haskell-patches/yesod-static_hack.patch | 193 + .../no-th/haskell-patches/yesod_hack-TH.patch | 200 + .../osx/git-annex.app/Contents/Info.plist | 41 + .../osx/git-annex.app/Contents/MacOS/README | 9 + .../osx/git-annex.app/Contents/MacOS/git | 31 + .../git-annex.app/Contents/MacOS/git-annex | 31 + .../Contents/MacOS/git-annex-shell | 31 + .../Contents/MacOS/git-annex-webapp | 32 + .../Contents/MacOS/git-receive-pack | 31 + .../git-annex.app/Contents/MacOS/git-shell | 31 + .../Contents/MacOS/git-upload-pack | 31 + .../osx/git-annex.app/Contents/MacOS/runshell | 86 + .../Contents/Resources/git-annex.icns | Bin 0 -> 77548 bytes standalone/trustedkeys.gpg | Bin 0 -> 4979 bytes standalone/windows/build-simple.sh | 43 + standalone/windows/build.sh | 74 + static/activityicon.gif | Bin 0 -> 529 bytes static/css/bootstrap-theme.css | 347 + static/css/bootstrap.css | 5785 +++++++++++ static/favicon.ico | Bin 0 -> 2550 bytes static/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes static/fonts/glyphicons-halflings-regular.svg | 229 + static/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41280 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes static/js/bootstrap.js | 1951 ++++ static/js/jquery.full.js | 9111 +++++++++++++++++ static/js/jquery.ui.core.js | 320 + static/js/jquery.ui.mouse.js | 169 + static/js/jquery.ui.sortable.js | 1289 +++ static/js/jquery.ui.widget.js | 521 + static/js/longpolling.js | 46 + static/syncicon.gif | Bin 0 -> 847 bytes templates/README | 7 + templates/actionbutton.hamlet | 3 + templates/bootstrap.hamlet | 14 + templates/configurators/addbox.com.hamlet | 28 + templates/configurators/adddrive.hamlet | 36 + .../configurators/adddrive/combine.hamlet | 22 + .../configurators/adddrive/encrypt.hamlet | 29 + .../configurators/adddrive/setupmodal.hamlet | 9 + templates/configurators/addglacier.hamlet | 38 + templates/configurators/addia.hamlet | 36 + templates/configurators/addrepository.hamlet | 19 + .../addrepository/archive.hamlet | 13 + .../configurators/addrepository/cloud.hamlet | 24 + .../addrepository/connection.hamlet | 3 + .../configurators/addrepository/misc.hamlet | 28 + .../configurators/addrepository/ssh.hamlet | 7 + .../addrepository/xmppconnection.hamlet | 13 + templates/configurators/adds3.hamlet | 33 + .../delete/currentrepository.hamlet | 36 + .../configurators/delete/finished.hamlet | 15 + templates/configurators/delete/start.hamlet | 13 + templates/configurators/delete/xmpp.hamlet | 12 + .../configurators/edit/nonannexremote.hamlet | 19 + .../configurators/edit/repository.hamlet | 40 + templates/configurators/enableaws.hamlet | 34 + .../configurators/enabledirectory.hamlet | 11 + templates/configurators/enableia.hamlet | 26 + templates/configurators/enablewebdav.hamlet | 26 + templates/configurators/fsck.cassius | 4 + templates/configurators/fsck.hamlet | 32 + templates/configurators/fsck/form.hamlet | 2 + .../configurators/fsck/formcontent.hamlet | 21 + .../configurators/fsck/preferencesform.hamlet | 7 + templates/configurators/fsck/status.hamlet | 5 + templates/configurators/genkeymodal.hamlet | 15 + templates/configurators/main.hamlet | 42 + templates/configurators/needconnection.hamlet | 14 + templates/configurators/needgcrypt.hamlet | 11 + templates/configurators/needglaciercli.hamlet | 11 + templates/configurators/newrepository.hamlet | 14 + .../newrepository/combine.hamlet | 20 + .../configurators/newrepository/first.hamlet | 21 + .../configurators/newrepository/form.hamlet | 13 + .../configurators/pairing/disabled.hamlet | 6 + .../pairing/local/inprogress.hamlet | 19 + .../configurators/pairing/local/prompt.hamlet | 53 + .../configurators/pairing/xmpp/end.hamlet | 33 + .../pairing/xmpp/friend/confirm.hamlet | 12 + .../pairing/xmpp/friend/prompt.hamlet | 13 + .../pairing/xmpp/self/prompt.hamlet | 21 + .../pairing/xmpp/self/retry.hamlet | 12 + templates/configurators/preferences.hamlet | 16 + templates/configurators/rsync.net/add.hamlet | 43 + .../configurators/rsync.net/encrypt.hamlet | 49 + templates/configurators/ssh/add.hamlet | 26 + templates/configurators/ssh/combine.hamlet | 22 + templates/configurators/ssh/confirm.hamlet | 73 + templates/configurators/ssh/enable.hamlet | 28 + templates/configurators/ssh/error.hamlet | 13 + .../configurators/ssh/expiredpassword.hamlet | 12 + templates/configurators/ssh/setupmodal.hamlet | 13 + templates/configurators/ssh/testmodal.hamlet | 9 + templates/configurators/unused.hamlet | 42 + templates/configurators/unused/form.hamlet | 6 + .../configurators/upgrade/android.hamlet | 10 + templates/configurators/xmpp.hamlet | 43 + templates/configurators/xmpp/buddylist.hamlet | 40 + templates/configurators/xmpp/disabled.hamlet | 6 + .../configurators/xmpp/needcloudrepo.hamlet | 18 + templates/control/log.hamlet | 7 + templates/control/notrunning.hamlet | 13 + templates/control/notrunning.julius | 3 + templates/control/repairrepository.hamlet | 29 + .../control/repairrepository/done.hamlet | 14 + templates/control/repositoryswitcher.hamlet | 15 + templates/control/shutdown.hamlet | 10 + templates/controlmenu.hamlet | 21 + templates/dashboard/main.hamlet | 11 + templates/dashboard/metarefresh.hamlet | 2 + templates/dashboard/transfers.cassius | 8 + templates/dashboard/transfers.hamlet | 43 + templates/documentation/about.hamlet | 34 + templates/documentation/license.hamlet | 2 + templates/documentation/repogroup.hamlet | 61 + templates/error.cassius | 3 + templates/error.hamlet | 31 + templates/notifications/longpolling.julius | 11 + templates/page.cassius | 34 + templates/page.hamlet | 30 + templates/page.julius | 22 + templates/repolist.hamlet | 82 + templates/repolist.julius | 28 + templates/sidebar/alert.hamlet | 27 + templates/sidebar/main.hamlet | 3 + 6625 files changed, 217399 insertions(+) create mode 100644 .ghci 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/LockFile.hs create mode 100644 Annex/MakeRepo.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/CredPairCache.hs create mode 100644 Assistant/DaemonStatus.hs create mode 100644 Assistant/DeleteRemote.hs create mode 100644 Assistant/Drop.hs create mode 100644 Assistant/Fsck.hs create mode 100644 Assistant/Gpg.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/RemoteControl.hs create mode 100644 Assistant/Repair.hs create mode 100644 Assistant/RepoProblem.hs create mode 100644 Assistant/Restart.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/RemoteControl.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/CredPairCache.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/RemoteControl.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/Upgrade.hs create mode 100644 Assistant/WebApp.hs create mode 100644 Assistant/WebApp/Bootstrap3.hs create mode 100644 Assistant/WebApp/Common.hs create mode 100644 Assistant/WebApp/Configurators.hs create mode 100644 Assistant/WebApp/Configurators/AWS.hs create mode 100644 Assistant/WebApp/Configurators/Delete.hs create mode 100644 Assistant/WebApp/Configurators/Edit.hs create mode 100644 Assistant/WebApp/Configurators/Fsck.hs create mode 100644 Assistant/WebApp/Configurators/IA.hs create mode 100644 Assistant/WebApp/Configurators/Local.hs create mode 100644 Assistant/WebApp/Configurators/Pairing.hs create mode 100644 Assistant/WebApp/Configurators/Preferences.hs create mode 100644 Assistant/WebApp/Configurators/Ssh.hs create mode 100644 Assistant/WebApp/Configurators/Unused.hs create mode 100644 Assistant/WebApp/Configurators/Upgrade.hs create mode 100644 Assistant/WebApp/Configurators/WebDAV.hs create mode 100644 Assistant/WebApp/Configurators/XMPP.hs create mode 100644 Assistant/WebApp/Control.hs create mode 100644 Assistant/WebApp/DashBoard.hs create mode 100644 Assistant/WebApp/Documentation.hs create mode 100644 Assistant/WebApp/Form.hs create mode 100644 Assistant/WebApp/Gpg.hs create mode 100644 Assistant/WebApp/MakeRemote.hs create mode 100644 Assistant/WebApp/Notifications.hs create mode 100644 Assistant/WebApp/OtherRepos.hs create mode 100644 Assistant/WebApp/Page.hs create mode 100644 Assistant/WebApp/Repair.hs create mode 100644 Assistant/WebApp/RepoId.hs create mode 100644 Assistant/WebApp/RepoList.hs create mode 100644 Assistant/WebApp/SideBar.hs create mode 100644 Assistant/WebApp/Types.hs create mode 100644 Assistant/WebApp/routes 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/BuildVersion.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/FindRef.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/NotifyChanges.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/Reinit.hs create mode 100644 Command/Reinject.hs create mode 100644 Command/RemoteDaemon.hs create mode 100644 Command/Repair.hs create mode 100644 Command/ResolveMerge.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/Command/Batch.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/Ddar.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 RemoteDaemon/Common.hs create mode 100644 RemoteDaemon/Core.hs create mode 100644 RemoteDaemon/Transport.hs create mode 100644 RemoteDaemon/Transport/Ssh.hs create mode 100644 RemoteDaemon/Transport/Ssh/Types.hs create mode 100644 RemoteDaemon/Types.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/Bloom.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/LinuxMkLibs.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/SimpleProtocol.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/URI.hs 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_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_15_77bafc01b47d4cf8f96bde2b6704ed71._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/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment create mode 100644 doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment create mode 100644 doc/assistant/comment_5_d17de359cdd46659170d373cd09c0979._comment create mode 100644 doc/assistant/connection.png 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/comment_1_c87889721e3a7e52ac1ed3752fa7db46._comment 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/automatic_conflict_resolution/comment_6_8a0860fee88f5954918305f055a39d8d._comment create mode 100644 doc/automatic_conflict_resolution/comment_7_3d2250cc26036b8532faa980065e20d0._comment create mode 100644 doc/automatic_conflict_resolution/comment_8_ef474c258ce8e0ebc6485c1366ae6315._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/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes.mdwn create mode 100644 doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_1_323262a080daed9cebd4caee4c887210._comment create mode 100644 doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_2_6172dcd7db2322084483a18d4f3cc2d6._comment create mode 100644 doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_3_5ae2178863709230ddb995905c629c4e._comment create mode 100644 doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_4_19d32634789a09c1b04e9d3fcde364f7._comment create mode 100644 doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn 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_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:_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_:_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___91__Terminal_session_finished__93__.mdwn create mode 100644 doc/bugs/Android___91__Terminal_session_finished__93__/comment_1_31af3e5226430a4e94de58c0e33bd22b._comment create mode 100644 doc/bugs/Android___91__Terminal_session_finished__93__/comment_2_a5bcbd2f85283e29e237e9850cd8109a._comment create mode 100644 doc/bugs/Android___91__Terminal_session_finished__93__/comment_3_965efa6736dcff4d7010ea5533f31a59._comment create mode 100644 doc/bugs/Android___91__Terminal_session_finished__93__/comment_4_90a0be2296b4a1d8c1708423666c9619._comment create mode 100644 doc/bugs/Android___91__Terminal_session_finished__93__/comment_5_be4b720293992f75b9cc3e8f6687fb87._comment create mode 100644 doc/bugs/Android___91__Terminal_session_finished__93__/comment_6_8e439138c97b8853ab2b6f96f6111568._comment create mode 100644 doc/bugs/Android___91__Terminal_session_finished__93__/comment_7_6142516d816f78c724e22737aa3bca53._comment create mode 100644 doc/bugs/Android_can__39__t_sync_files_with_utf-8_characters_in_names.mdwn create mode 100644 doc/bugs/Android_can__39__t_sync_files_with_utf-8_characters_in_names/comment_1_bcc3ce19cf26731057a7f3189fcbae19._comment create mode 100644 doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean.mdwn create mode 100644 doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean/comment_1_b41666c032aeb2d0de35023328391edb._comment create mode 100644 doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean/comment_2_95ebed938df3db2b6d4ebe4c666c08f8._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_breaks_when_broken_symlinks_are_in_.git__47__annex__47__tmp.mdwn create mode 100644 doc/bugs/Assistant_breaks_when_broken_symlinks_are_in_.git__47__annex__47__tmp/comment_1_659e0c5127c92b1c7643823d0c240543._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files.mdwn create mode 100644 doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_1_f32fbae29e4db039804c0853256c238c._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_2_405bfa00dfd433352c263afe75e94b2c._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_3_c8cac8d800199ca4d8a65ba72abf678e._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_4_ee5fa8a22d1571b0040aa97c4979ef92._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_5_eef448b9e3dd1a717430a60d1001a7ee._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate.mdwn create mode 100644 doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_1_418103046e296a43cfe0f0cf69e729d5._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_2_9405804842bb23e8040ec85b271b18af._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_3_01fc26e443ea3a8a351174b45f25dc2a._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_4_6e8f0889359bb2f3e3438658c9776f76._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_5_902fe9ff295453461b66d84463205fc3._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_6_ce01656b191d2bb13a3ddc29794e1e7a._comment 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_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_10_edb2428552cf98bfb1735c2d6daf2b20._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/comment_1_ac8c39e362e6c806b9d68befc0199ccd._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/comment_2_b2941bf7901a1b2237b7210c8f0af2a5._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/comment_3_1429ca784a03bc424b3537cbe0449421._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/comment_4_f9e65cf5598b4b14eeee1f41f46d4084._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/comment_5_044ecac2d2e670e1ef69809c944093d1._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/comment_6_6f4f51e1583bed5e7e601e4f30f4207b._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/comment_7_683a0a3d4caea0ee625e41ae8a6c7c06._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/comment_8_03dd76b01f46a7cc66eddac3e054c8ad._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/comment_9_5f4444f03cbebaa44628288095383679._comment create mode 100644 doc/bugs/Assistant_merge_loop.mdwn create mode 100644 doc/bugs/Assistant_merge_loop/comment_10_8fe176691f0f61c15085d3c38f0ea50f._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_11_6e3a78327c0b813415ebf85e298813d4._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_1_ccf46511b924f86b488dba25060baa06._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_2_afcbf3f8575e1a967c79693b94ef055c._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_3_07341221b2839fdc1c43634e011451d2._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_4_7ae215b478843d2a8c705cac385fcf22._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_5_11873461f093a266f0bb7e129bc21cde._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_6_e7b6ecdd7e2b0222ea0baa0ed770e66d._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_7_7717d074611943b831f00ad10918b515._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_8_5ce91ac76498539ada344d1639984302._comment create mode 100644 doc/bugs/Assistant_merge_loop/comment_9_b09a5eaa2588559e19b3549bd3c8b496._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_10_d46c6314bff75a0ae679bc2358b28c2b._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_11_1c2c3adfbccd2b14a7d1c4618800e735._comment 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-repair_greatly_slows_down_the_machine/comment_7_4649fa11745ff668e43833209811d005._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_8_6138a48f0b7e8be2bb66430397afdf5a._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_9_3da5940bb2e9689b00239eec9a073f1c._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android.mdwn create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_10_da4e26c77376a8171493a815bdb51ff1._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_11_506e26de284a6429366def33b007bc0c._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_12_a77477951576fc657d693811f11f9975._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_13_c3ef67bded8ed3c511a8ea85b8bd81a5._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_1_97cf233d8401d642337d5fe9dd525e2b._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_2_4981a0a894b77e94a3bffec82b0f6e51._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_3_dbe960392aaa0839886381820754814a._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_4_cdf9621fe3e9f8eb8b7af88f779a7116._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_5_a2318f094b30f58fefc072807896c099._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_6_7c2f1d914793798708ca13b6ac3dd474._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_7_a24b5165590b5d58919da1003cd20c54._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_8_71ed14b8e5a898b1643d5e37591c2476._comment create mode 100644 doc/bugs/Bootstrap3_icons_missing_on_Android/comment_9_15357e33c2431080d45f7cef5f4f1209._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/Bug_Report_doesn__39__t_work.mdwn create mode 100644 doc/bugs/Build_failure_at_commit_1efe4f3.mdwn create mode 100644 doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.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.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_start_on_Cyanogenmod_10.2_nightly.mdwn 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_clone_an_annex.mdwn create mode 100644 doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._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/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn create mode 100644 doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_1_81a4647a9b51bed8c230a2a16990915d._comment create mode 100644 doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_2_f8e97dded9ba6d2305de1278025924fe._comment create mode 100644 doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_3_eb34061429cb8c7d0b155825e84b657b._comment create mode 100644 doc/bugs/Compilation_error_when_building_version_5.20140402_in_cabal_sandbox.mdwn create mode 100644 doc/bugs/Compilation_error_when_building_version_5.20140402_in_cabal_sandbox/comment_1_bd830cadaeffda0366b3ae46b34c0c55._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_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/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_remote_located_in___34____126____47__wherever__34___works_incorrectly.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/Daemon_stops_working_on_mounted_CIF_share.mdwn create mode 100644 doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_1_2a5fb522cbf6e2cefbee0a5fc48287d0._comment create mode 100644 doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_2_6b8d35d464e248c29764e3adbc1c9bae._comment create mode 100644 doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_3_e134ba74ec996a419d6f9903871b9b03._comment create mode 100644 doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_4_2ad592d92dda2d1e78235bad5764f5d9._comment create mode 100644 doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_5_42ad8c7944c210ac1be812e463e03d7c._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/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/Drop_--from_always_trusts_local_repository.mdwn 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_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/EvilLinker_needs_to_escape_spaces_in_user_name.mdwn create mode 100644 doc/bugs/EvilLinker_needs_to_escape_spaces_in_user_name/comment_1_6b289221a65a750444b1b5850df3386c._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications.mdwn create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_10_13a35801805ea3d2d4428b1539f96b16._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_11_632456a0a1d399ee2bbac76b7d63a5f1._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_12_e4d268f269cc1701736cc5a39719ac20._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_13_962cd8d7280cbc1d61778d69f3a393f0._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_14_5b3bb068b62b12c7cc7504836a8acf32._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_15_5271ba4eed013adec8391ddfcc11eda8._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_1_7a536b79bae7d8f897f014d17dbb90b6._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_2_349959a6daa722c8350f73feb0b27162._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_3_923fc470727ecf21f0bb368b0486b15d._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_4_68a8434018430a0d2671c4e23e9a3b12._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_5_0b7d69489b9f10bb5ed617b5b62ae063._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_6_650d950da065eeac966c2498418c668d._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_7_834c512e32ad5a157d8fa9fd472831b4._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_8_2500e6f9545b916dfa41549140c053fd._comment create mode 100644 doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_9_e2dc3ff80bbd66837f00975b16e17126._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/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_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/Git-Annex_requires_all_repositories_to_repair.mdwn create mode 100644 doc/bugs/Git-Annex_requires_all_repositories_to_repair/comment_1_dff1424e48835d7d3eb8653fc59de18a._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_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/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/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/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_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn create mode 100644 doc/bugs/Installation_fails:___34__Duplicate_instance_declarations__34__.mdwn 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/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/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_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/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/Manual_content_mode_isn__39__t_manual.mdwn create mode 100644 doc/bugs/Merge_involving_symlink_yields_unexpected_results.mdwn create mode 100644 doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_1_e8a2ea1b8573bee45b70bcc7ef7e3bed._comment create mode 100644 doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_2_b6182038292bd72dc4711e4575510172._comment create mode 100644 doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_3_c6ca13d475b3f846c95606c20e1a3052._comment create mode 100644 doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_4_13179e0f72026092e48c13082818ce68._comment create mode 100644 doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_5_585c8a5a13bb17032bfe30818345f936._comment 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/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X.mdwn create mode 100644 doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_1_75c14b405929a8f771a7c261dcc4b7a2._comment create mode 100644 doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_2_f52483415c623ea0649c3805728ce761._comment create mode 100644 doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_3_fd73fbeef61df106f084ac235fca904a._comment create mode 100644 doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_4_c5e9843a956984efd22bad629930f6bd._comment create mode 100644 doc/bugs/Mtime_of_objects_reset_when_synchronized_to_a_different_repository.mdwn create mode 100644 doc/bugs/Mtime_of_objects_reset_when_synchronized_to_a_different_repository/comment_1_651965d8a9f0e0c07313c1a2916f77e5._comment 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_such_file_with_certain_filenames_using_WORM_backend.mdwn create mode 100644 doc/bugs/No_such_file_with_certain_filenames_using_WORM_backend/comment_1_a1db4ff3e8517d7cbe649bca1ed275d0._comment 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_assistant_fails_to_download_new_file_after_initial_pass.mdwn create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_10_3feba4ba84efb77bd4f8f46b6b4600f1._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_1_a33fcd088e419d8e6c459e42f21f8bbe._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_2_47196f7e781137751ebd1a1d7083838a._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_3_672d98ee06e051430f8e01faa93bb4cf._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_4_06fb3031b838cd443326f4ecd689b600._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_5_42d447400c15acf6ca031d165b2c781c._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_6_edd7d5d5c761ff665840f0ef7bea50c9._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_7_18e5334ab89efcf89ba8847436d55065._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_8_35b2bbdc24a7bd686527cd1839dee7d0._comment create mode 100644 doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_9_a771c6b453e6a4b3895dd69a53093440._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/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__.mdwn create mode 100644 doc/bugs/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__/comment_1_7508685b6f676c72e316642b80e40ee8._comment create mode 100644 doc/bugs/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__/comment_2_c4dd12ea578d1f07464e1b9d68ec96cf._comment create mode 100644 doc/bugs/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__/comment_3_8687c1d1c44d88a8ac13208273565d6c._comment create mode 100644 doc/bugs/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__/comment_4_62be3dd4092b15cdf85cf9a231b2863a._comment create mode 100644 doc/bugs/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__/comment_5_cca4905426a3e01da6e12be855c7a418._comment create mode 100644 doc/bugs/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__/comment_6_ae2ca07169321c4a51b7e8e581fda5e2._comment create mode 100644 doc/bugs/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__/comment_7_ae5c434a9c94aa000b604095f52e3d3c._comment 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_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/Prevent_accidental_merges.mdwn create mode 100644 doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._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/Recreating_remote_repository__39__s_annex.mdwn create mode 100644 doc/bugs/Recreating_remote_repository__39__s_annex/comment_1_9fffb1329a4a06111cf2afd8552aea62._comment create mode 100644 doc/bugs/Recreating_remote_repository__39__s_annex/comment_2_b7f5634e136294ea1a3d4ce6de58fc5d._comment 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/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn create mode 100644 doc/bugs/Repository_Information_Is_Lost.mdwn create mode 100644 doc/bugs/Repository_Information_Is_Lost/comment_1_bae0ed4c0a6baf1675f8de1663042f43._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/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__.mdwn create mode 100644 doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_1_7e512732f1d24300dd13bb093f28122d._comment create mode 100644 doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_2_0ede40e0d68bfb9c6dbc1777f944ed06._comment create mode 100644 doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_3_4ce1601f5dbd8fb769d3c5bb429c3bc5._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_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/S3_upload_not_using_multipart/comment_1_5bed9faafc43b535f7820749510aaa14._comment create mode 100644 doc/bugs/S3_upload_not_using_multipart/comment_2_d82952cf324e769e45f4d90f200210f4._comment create mode 100644 doc/bugs/SanityCheckerStartup_crashed.mdwn create mode 100644 doc/bugs/SanityCheckerStartup_crashed/comment_1_f30b69c11b487334ef02ce7bfcdeb36c._comment create mode 100644 doc/bugs/SanityCheckerStartup_crashed/comment_2_8b800bf7b54e487e82d0897c87967f22._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/Selfsigned_certificates_with_jabber_fail_miserably./comment_4_a1948b7cd6ea990c8f1be5e483c835fa._comment create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_5_293b333134c97dc666a825cc7a8b2b62._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_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/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/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_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_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_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn create mode 100644 doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file.mdwn create mode 100644 doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file/comment_1_a1392b92efdff82783a4b0cc2c3c7f2f._comment create mode 100644 doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file/comment_2_5e153b7c59c474988fe551a505e545bc._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/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/Truncated_file_transferred_via_S3/comment_6_6aa9261c0cdb02c6dd66d25f5c71f622._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/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/Upgrade_Does_not_Complete_on_OS_X.mdwn create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_10_8c1487635f724d017ebe2f8b7bc10e8d._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_1_84e52a4d1502fd622bdb25e04b459292._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_2_f2b109f6cf92f101d7f0afeb91605240._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_3_df9b111aefea82b9d108495b79d7ffb4._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_4_e3b5bc815376383bbd1f312cc1c32a41._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_5_cd9b77e6670840a9902f5be80e1e658a._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_6_4584393333d377532d8607b42319abd9._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_7_d9d36ff62267dde98a27c5981951df7f._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_8_5b26711c737eeb0b302060f098cb320b._comment create mode 100644 doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_9_1bf050056dcac7c1e0f497ee6e87a95a._comment create mode 100644 doc/bugs/VFAT_crazy_limit_on_max_filenames_in_directory.mdwn 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/Webapp_fails_to_resolve_ipv6_hostname.mdwn 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/Windows_build_test_failures.mdwn create mode 100644 doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment create mode 100644 doc/bugs/Windows_daemon_silently_dies.mdwn create mode 100644 doc/bugs/Windows_daemon_silently_dies/comment_1_b590aaeedec78c8540d549a8c773881e._comment create mode 100644 doc/bugs/Windows_daemon_silently_dies/comment_2_472975d2bd9784ae40b35f11fc561231._comment create mode 100644 doc/bugs/Windows_daemon_silently_dies/comment_3_48415a7251abffca998b8dccc5e0ba80._comment create mode 100644 doc/bugs/Windows_daemon_silently_dies/comment_4_1c0b0b2e7180425ff2d5e5316a138f7d._comment create mode 100644 doc/bugs/Windows_daemon_silently_dies/comment_5_0d14dd2c8d94a81ffd5aae07e927344f._comment create mode 100644 doc/bugs/Windows_daemon_silently_dies/comment_6_20a420680058f84a8cbd43682957fe7b._comment create mode 100644 doc/bugs/Windows_daemon_silently_dies/comment_7_1514739ba9885917d03597dcc6aa7bec._comment create mode 100644 doc/bugs/Windows_daemon_silently_dies/comment_8_0210436870e6622a83c9b4788e31eef4._comment create mode 100644 doc/bugs/Windows_file_timestamp_timezone_madness.mdwn create mode 100644 doc/bugs/Windows_file_timestamp_timezone_madness/comment_1_9db59ab2242186a23a47337a1597f4e2._comment create mode 100644 doc/bugs/Windows_file_timestamp_timezone_madness/comment_2_a6a3871747306913b69abcd73d13305e._comment create mode 100644 doc/bugs/Windows_file_timestamp_timezone_madness/comment_3_7fe149bedb8ceab75953996ac8e20f0f._comment create mode 100644 doc/bugs/Windows_file_timestamp_timezone_madness/comment_4_c9e8c9997b7c3a82c14fc34af319382d._comment create mode 100644 doc/bugs/Windows_file_timestamp_timezone_madness/comment_5_0739426403f5bf9954acbc86ca0d11ea._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/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/__171__transferkey__187___fails_for_bare_remotes.mdwn create mode 100644 doc/bugs/__171__transferkey__187___fails_for_bare_remotes/comment_1_dd4538ab19a7f8e0f49aa0156aeaae43._comment create mode 100644 doc/bugs/__171__transferkey__187___fails_for_bare_remotes/comment_2_4276ff682d10c1d4be9728f9b649ebae._comment create mode 100644 doc/bugs/__171__uninit__187___on_direct_mode_repo_gives___171__removeLink:_permission_denied___40__Permission_denied__41____187__.mdwn 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__fatal:_bad_config_file__34__.mdwn create mode 100644 doc/bugs/__34__git-annex:_direct:_1_failed__34___on_Windows.mdwn 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/__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/__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_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__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/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_a_remote_server_fails.mdwn create mode 100644 doc/bugs/adding_a_remote_server_fails/comment_1_cf7ea9171f002c5793a882b42d33a77d._comment create mode 100644 doc/bugs/adding_existing_repo_as_remote_in_webapp_may_reset_its_group.mdwn 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/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn create mode 100644 doc/bugs/android_4.3_install_failed_.mdwn create mode 100644 doc/bugs/android_4.3_install_failed_/comment_1_82447f1e24d7e8df8048464d1b7df117._comment create mode 100644 doc/bugs/android_4.3_install_failed_/comment_2_67ace7c454c7e962ca69e42178142e80._comment create mode 100644 doc/bugs/android_4.3_install_failed_/comment_3_051e39129a38e439f24703385f503cf4._comment create mode 100644 doc/bugs/android_autobuild_broken.mdwn 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/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_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_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_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_doesn__39__t_sync_file_permissions/comment_6_13db3474113b157b7431eb1c835e5814._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_23_48a4c8d9dcc6cec243c6072090f26b6d._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_expensive_scan_unnecessarily_queues_files.mdwn create mode 100644 doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_1_bc874e077009b81ab36a6d43d793030a._comment create mode 100644 doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_2_a7e9d8ec500399dd6794e168f85e6a5c._comment create mode 100644 doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_3_a0824e00f04f95c39823f29d6c76e7fe._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_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_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/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_merge_commit_deleting_all_files.mdwn create mode 100644 doc/bugs/bad_merge_commit_deleting_all_files/comment_1_3503644244e39c65d531807769365f50._comment create mode 100644 doc/bugs/bad_merge_commit_deleting_all_files/comment_2_9c4c950da0c07bf7c7edfcc7cc3b6011._comment create mode 100644 doc/bugs/bad_merge_commit_deleting_all_files/comment_3_be42de12faf15562265ad6cf8964f5db._comment create mode 100644 doc/bugs/bad_merge_commit_deleting_all_files/comment_4_d5cbd1440e4d6706eb14644a4ff1883b._comment create mode 100644 doc/bugs/bad_merge_commit_deleting_all_files/comment_6_c532859deb682dff9e59037d08f66a51._comment create mode 100644 doc/bugs/bad_merge_commit_deleting_all_files/comment_6_c946d2793fe0354151c447ddd0e59fd7._comment create mode 100644 doc/bugs/bad_merge_commit_deleting_all_files/comment_7_24dea380fcf470e0ea488dece0410f37._comment 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/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_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn create mode 100644 doc/bugs/can__39__t_connect_jabber_with_custom_google_apps_domain.mdwn create mode 100644 doc/bugs/can__39__t_connect_jabber_with_custom_google_apps_domain/comment_1_6537e928a0d6d5c41b55370f112f4afb._comment 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/cannot_link_executable_on_android.mdwn create mode 100644 doc/bugs/case-insensitive.mdwn create mode 100644 doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.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/configurable_path_to_git-annex-shell/comment_5_178452f3c2671830d1a9f5e1d11accb4._comment create mode 100644 doc/bugs/configurable_path_to_git-annex-shell/comment_5_77b2269936f740cacbc955b95f9da51d._comment create mode 100644 doc/bugs/confirmed.mdwn 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_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_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_plain_directory_where_a_mountpoint_should_have_been/comment_5_64bf56f2b0ff206c3caf5cadebfd0cda._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/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_fails__44___left_in_an_inconsistent_state.mdwn create mode 100644 doc/bugs/direct_mode_fails__44___left_in_an_inconsistent_state/comment_1_be1302a006a66e501fe543f3af191fea._comment create mode 100644 doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn create mode 100644 doc/bugs/direct_mode_merge_interrupt.mdwn create mode 100644 doc/bugs/direct_mode_should_refuse_to_merge_with_illegal_filenames.mdwn create mode 100644 doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn create mode 100644 doc/bugs/done.mdwn create mode 100644 doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn 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/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_compiling_network-info_when_compiling_git-annex.mdwn create mode 100644 doc/bugs/error_compiling_network-info_when_compiling_git-annex/comment_1_1b5d236567123300924427624e0e48c8._comment create mode 100644 doc/bugs/error_compiling_network-info_when_compiling_git-annex/comment_2_4e5ffd0d5b965b9429b937610b7998d5._comment 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/extraneous_shell_escaping_for_rsync_remotes.mdwn create mode 100644 doc/bugs/failed_sync_with_direct_mode_repo.mdwn create mode 100644 doc/bugs/failed_sync_with_direct_mode_repo/comment_1_fb4026cc81eb0ec1e656e4a81ffacc4f._comment create mode 100644 doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn create mode 100644 doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_1_31cf32ef2d597573ed3c5f06a1b40a1c._comment create mode 100644 doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_2_7d64382c66555ec9c5531840aa19e809._comment create mode 100644 doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_3_850a917a3d1ae50ba8f0e81a64168268._comment create mode 100644 doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_4_7c4660ea44178cba7f7a4cc5f1bebae4._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:_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:_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/files_lost_during_upgrade.mdwn create mode 100644 doc/bugs/files_lost_during_upgrade/comment_1_3f779c4d0c9fb27532b2981bd3ad4eee._comment create mode 100644 doc/bugs/files_lost_during_upgrade/comment_2_80ba8c217e83c9d44a9dc52f4028719d._comment 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/forget_corrupts_non-ascii_chars.mdwn create mode 100644 doc/bugs/forget_corrupts_non-ascii_chars/comment_1_fc8a4a93be2c234567836a4acee90957._comment create mode 100644 doc/bugs/forget_corrupts_non-ascii_chars/comment_2_31f9362619dee0b8ebae80694ae1b2d0._comment create mode 100644 doc/bugs/forget_corrupts_non-ascii_chars/comment_3_6310ae21036582688881f1890a5c4643._comment create mode 100644 doc/bugs/forwarded.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/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.app_doesn__39__t_seem_to_use_the_bundled_git.mdwn create mode 100644 doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git/comment_1_73924adc1c3c0dca5adce9a5e1740e48._comment create mode 100644 doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git/comment_2_81c2896c9dfe5d96ad5a8f40cb312790._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:_createSession:_permission_denied___40__Operation_not_permitted__41__.mdwn create mode 100644 doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_1_b7a327b668e2ca053713bec1dc4e6314._comment create mode 100644 doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_2_8864149bd87f7956143109ab591afe4f._comment create mode 100644 doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_3_1229d5ea8799f0a744b3f03f620df1ec._comment create mode 100644 doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_4_975d2631faa17d257a6fce40e24a6e3b._comment create mode 100644 doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_5_013be36151fc710ec30756b0f68f43dc._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_annex_repo_not_found.mdwn create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant/comment_1_67cdbedc70695d1e4be81e59ab9b87bd._comment create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant/comment_2_3a8041ce622b9288261fab57ecb87c28._comment create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant/comment_3_2597b2008557b80f4b71630c5c4a4241._comment create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant/comment_4_5dc46103994f064f5b9e120a16317dbd._comment create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant/comment_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant/comment_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant/comment_7_85e8a286d6b1ec5212614c36bf54addb._comment create mode 100644 doc/bugs/git-annex_auto_upgrade_is_redundant/comment_8_2b2152844612d83f295a5de02f6ed3e7._comment create mode 100644 doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog.mdwn create mode 100644 doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_1_b83888a98075125dd043f323c99da03b._comment create mode 100644 doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_2_4a7d824b6e75693cf47f6efbf2c99e2e._comment 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_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed.mdwn create mode 100644 doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_1_0fc5c7251ead7a0fbbcd357a8bc53f05._comment create mode 100644 doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_2_992c1a51d0300bd676cb431688efa524._comment create mode 100644 doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_3_3001a11839eff6a4c3a9f12096b29704._comment create mode 100644 doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_4_a13abb45b9a94d275177641db0538765._comment create mode 100644 doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_5_faac2d48950307ce245f0da501ace730._comment create mode 100644 doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_6_7df03eee7d5dc5a7ed0c9abef5053788._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_fails_to_initialize_under_Windows_with_cygwin.mdwn create mode 100644 doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_1_24d626923403b097f57bc3d3a8c5befa._comment create mode 100644 doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_2_32a74f078f45ee069a7d386734e379e2._comment create mode 100644 doc/bugs/git-annex_fails_to_start_when_nautilus_script_directory_is_missing.mdwn create mode 100644 doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups.mdwn create mode 100644 doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups/comment_1_b3090201e90a78e049cf299fc322d60e._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_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_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_remotedeamon.mdwn create mode 100644 doc/bugs/git-annex_remotedeamon/comment_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment create mode 100644 doc/bugs/git-annex_remotedeamon/comment_2_82f71852df61d12333d08ba25af9d7be._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_does_not_push.mdwn create mode 100644 doc/bugs/git-annex_sync_does_not_push/comment_1_8b9b53163b012563b3e80f8eded76aaa._comment 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_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_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory.mdwn create mode 100644 doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_1_984f75d8078f2809486f38ecb3b16be3._comment create mode 100644 doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_2_c0f07e2d4bb142389629050479dd1465._comment create mode 100644 doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_3_7a58a884aaacedca9697b17cd5248214._comment create mode 100644 doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_4_aa4f1806207138115d2a95935bb0546b._comment create mode 100644 doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_5_fa95f93416e3d6e66af557df6562f1e5._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_copy_--fast_does_not_copy_files.mdwn create mode 100644 doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn create mode 100644 doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_1_ab82b880bd75a206e0717146e1b79aba._comment create mode 100644 doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_2_460e78ea8603bd87203d8014bcc3eb9a._comment create mode 100644 doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_3_17e9c2d29ddadcabc30ce884ffe0f853._comment create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de.mdwn create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_1_5ba4f22bda2f5438fb08753cf149b649._comment create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_2_b096cfdf26bfedfff16d882d7b2e060d._comment create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_3_210be77aabb0ef5b85865cd08c51861e._comment create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_4_bb974d882fbb31aa54e6de38410a2318._comment create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_5_be655cbea27b6c87d298a75e1697a87d._comment create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_6_72d1dac6627bbe22d5bd140215d82c47._comment create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_7_8a8dfb15684525e156d6334e9f67a55c._comment create mode 100644 doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_8_f1a6e413756066659020e20147373a11._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_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_enableremote_gcrypt_failure_leaves_a_remote.mdwn create mode 100644 doc/bugs/git_annex_ignores_GIT__95__SSH__63__.mdwn create mode 100644 doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes.mdwn create mode 100644 doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/comment_1_99e8d2c1bbc23438f954d8ddc827078e._comment create mode 100644 doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/comment_2_7c8d91d78608d717164cb3e825654654._comment create mode 100644 doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn 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_sync_in_direct_mode_does_not_honor_skip-worktree/comment_5_cb98789c50c58f01055183dbaf7b4eba._comment create mode 100644 doc/bugs/git_annex_unlock_is_not_atomic.mdwn create mode 100644 doc/bugs/git_annex_unused_failes_on_empty_repository.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_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_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn create mode 100644 doc/bugs/git_mv_before_commit_breaks_symlinks.mdwn 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/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/glacier_from_multiple_repos.mdwn create mode 100644 doc/bugs/googlemail.mdwn create mode 100644 doc/bugs/gpg-agent.mdwn create mode 100644 doc/bugs/gpg-agent/comment_1_86860841aaa38541968693ec02f6a506._comment create mode 100644 doc/bugs/gpg_does_not_ask_for_password_inside_tmux.mdwn create mode 100644 doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_1_053b12e8b412723ff1d6b4e64e71af9e._comment create mode 100644 doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_2_44830ba952cad3b153249bd405671507._comment create mode 100644 doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_3_a63db33a1dc70e64418de8b4bea6a9fa._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/how_to_get_git-annex_shell_on_MAC__63__.mdwn create mode 100644 doc/bugs/how_to_get_git-annex_shell_on_MAC__63__/comment_1_780fbb7b8dda331503064dfa6bcabaa3._comment create mode 100644 doc/bugs/how_to_get_git-annex_shell_on_MAC__63__/comment_2_1785e99846998aa50e1c62a88b558196._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/import_leaves_stray___96__.tmp__96___files_if_interrupted.mdwn 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/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/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/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/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/manpage_has_slight_indentation_error.mdwn 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/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/moreinfo.mdwn create mode 100644 doc/bugs/nautilus__47__scripts__47__git-annex_get:_openFile:_does_not_exist___40__No_such_file_or_directory__41__.mdwn create mode 100644 doc/bugs/nautilus__47__scripts__47__git-annex_get:_openFile:_does_not_exist___40__No_such_file_or_directory__41__/comment_1_9fdeaa51ccc7c71dcfeea3ea783d3b50._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows.mdwn create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_1_988768c3e4f30c751034a0b0390cdd88._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_2_70a6c9af57eed4f8ceb3de63cbf8a5e6._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_3_7f48959c6242c5cc52e9d0a79fd3f85d._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_4_04b30dd9e510762ee547e7b45bdba660._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_5_beebbd4a41cccfc7aac3c19d76c3b978._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_6_957c5da5f336c7ef59e4149602471888._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_7_a8654cf656de55ccdcf40270a1ef4ca9._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_8_3c8bb1b1d67ca1a6e568e381d24a2574._comment create mode 100644 doc/bugs/no_git-annex_shell_on_Windows/comment_9_03646c9df9d4f4ea27459660fe65a976._comment 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/numcopies_deprecated__44___but_still_in_walkthrough.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/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_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/protocol_mismatch_after_interrupt.mdwn create mode 100644 doc/bugs/protocol_mismatch_after_interrupt/comment_1_415de83053dc61a64cf2e301223f1916._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/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_gcrypt_based_repos_and_conflicting_uuids.mdwn create mode 100644 doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_1_11af589cf646cb7552eeb5c7401934f5._comment create mode 100644 doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_2_d81cb9b47dea34b639dc250bb231010a._comment create mode 100644 doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_3_8df00f0ed4a26f702e0935b366521530._comment create mode 100644 doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_4_7eb33c23223dfc634eb3c9c6621f7f3e._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/remote_not_showing_up_in_webapp/comment_2_10638e99e2e11460f99266f56adbc1db._comment create mode 100644 doc/bugs/remote_not_showing_up_in_webapp/comment_3_4aa72acc0938f7f824ba10f3f102e8bc._comment create mode 100644 doc/bugs/repo_creation_fails_on_android_4.4.3.mdwn create mode 100644 doc/bugs/repo_creation_fails_on_android_4.4.3/comment_1_01e638ec9c6d74966d76b6ceb7c06bad._comment create mode 100644 doc/bugs/repo_creation_fails_on_android_4.4.3/comment_2_07c0f9387433b7107e9def2bfbed3039._comment create mode 100644 doc/bugs/repo_creation_fails_on_android_4.4.3/comment_3_caf4f02677ea9e7fe28dbace99aa6860._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/runs_of_of_memory_adding_2_million_files.mdwn create mode 100644 doc/bugs/runs_of_of_memory_adding_2_million_files/comment_1_8b60b7816b9bf2c8cdd21b5cae431555._comment create mode 100644 doc/bugs/runs_of_of_memory_adding_2_million_files/comment_2_32908da23e4fb38a7d20b765a5ab4656._comment create mode 100644 doc/bugs/runs_of_of_memory_adding_2_million_files/comment_3_3cff88b50eb3872565bccbeb6ee15716._comment create mode 100644 doc/bugs/runs_of_of_memory_adding_2_million_files/comment_4_e991986eb8ae49d2e69f7ed7fd61485f._comment create mode 100644 doc/bugs/runs_of_of_memory_adding_2_million_files/comment_5_241ad838135a7a377374ca9ba90aec5c._comment create mode 100644 doc/bugs/runs_of_of_memory_adding_2_million_files/comment_6_744982b77cc867e9e3a7d638c7a653d6._comment create mode 100644 doc/bugs/runs_of_of_memory_adding_2_million_files/comment_7_9add4ee13b7ea846e6495c28da214269._comment 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/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/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_portnum_bugs.mdwn create mode 100644 doc/bugs/ssh_portnum_bugs/comment_1_2026785c06e99b55158cd65c221eb598._comment create mode 100644 doc/bugs/ssh_portnum_bugs/comment_2_76551dfcd29b54814809c434d7cb64af._comment create mode 100644 doc/bugs/ssh_portnum_bugs/comment_3_ab49a0e307a29c7c20627bbb3b10ab1d._comment create mode 100644 doc/bugs/ssh_portnum_bugs/comment_4_e0d96a43208453dc29373d0e045751e3._comment create mode 100644 doc/bugs/ssh_portnum_bugs/comment_5_9ed44cdb79224dac6b000983d77d53f3._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_does_not_commit_with_alwasycommit___61___false.mdwn 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/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/trust_command_and_gitconfig_contradiction_causing_confusion.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/undefined.mdwn create mode 100644 doc/bugs/unfinished_repository_when_using_annex-ignore_true_.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/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_gpg_encryption_with_multiple_keys_fails.mdwn create mode 100644 doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_1_584390159278577da78b05bc7bb0e673._comment create mode 100644 doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_2_51855f5bb857e1b6bc5531cdd7073c31._comment create mode 100644 doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_3_3a6ff3dbc24850b065d045c7c9398eb1._comment create mode 100644 doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_4_84168b56288262e01280da59ffaf19f6._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/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_doesn__39__t_start_when___126____47__annex_isn__39__t_a_git_repo.mdwn create mode 100644 doc/bugs/webapp_usability:_fails_mysteriously_on_newer_repo_layouts.mdwn create mode 100644 doc/bugs/weird_unicode_bug_on_windows.mdwn create mode 100644 doc/bugs/weird_unicode_bug_on_windows/comment_1_69af9bd8c7898fccc2219edd860d547b._comment 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_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/youtube_support_suddenly_stopped_working.mdwn create mode 100644 doc/builds.mdwn create mode 100644 doc/coding_style.mdwn create mode 100644 doc/coding_style/comment_1_70521cf79ad06832b1d73fc2c20c68ec._comment create mode 100644 doc/coding_style/comment_2_a820b7c8ae7c2290eb000f61bdb5c514._comment 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/contribute.mdwn 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/inotify/comment_7_00809aaad6b68f189a9cc42af810a0a6._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/sshpassword/comment_1_24399abe0a0c1de271490ee15e064760._comment create mode 100644 doc/design/assistant/sshpassword/comment_2_36a811bca209c7ac8a44d64bf8bc5bf3._comment 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/git-remote-daemon.mdwn create mode 100644 doc/design/git-remote-daemon/comment_1_bfa8f33a3fdb6e271dfbdd0378b5d364._comment 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/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment create mode 100644 doc/design/preferred_content.mdwn create mode 100644 doc/design/requests_routing.mdwn create mode 100644 doc/design/requests_routing/comment_1_421b14a4dd9d6c431e00333057df1627._comment create mode 100644 doc/design/requests_routing/simroutes.hs 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_145__a_plan.mdwn create mode 100644 doc/devblog/day_145__a_plan/comment_1_c0ceea77443be1172527ed8549f000a4._comment create mode 100644 doc/devblog/day_146__halfway_to_git-remote-daemon.mdwn create mode 100644 doc/devblog/day_147__git-annex_remotedaemon.mdwn create mode 100644 doc/devblog/day_148__too_many_documents.mdwn create mode 100644 doc/devblog/day_149__remote_control_working.mdwn create mode 100644 doc/devblog/day_149__signal.mdwn 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_151__birthday_bug.mdwn create mode 100644 doc/devblog/day_152__more_ssh_connection_caching.mdwn create mode 100644 doc/devblog/day_153__remotedaemon_has_landed.mdwn create mode 100644 doc/devblog/day_153__remotedaemon_has_landed/comment_1_f19ae6b3d6f33a68e4ffe0c32f788745._comment create mode 100644 doc/devblog/day_153__remotedaemon_has_landed/comment_2_fbf0c50f772e958af638d2b72dac73f5._comment create mode 100644 doc/devblog/day_154__catching_up.mdwn create mode 100644 doc/devblog/day_155__missing_bits.mdwn create mode 100644 doc/devblog/day_155__missing_bits/comment_1_76424498600ba603946035efffb88023._comment create mode 100644 doc/devblog/day_156__release_day.mdwn create mode 100644 doc/devblog/day_157__upgrade_checking.mdwn create mode 100644 doc/devblog/day_158__enroute_to_Brazil.mdwn create mode 100644 doc/devblog/day_159__tmp_file_cleanup.mdwn create mode 100644 doc/devblog/day_160__.mdwn create mode 100644 doc/devblog/day_161__routing_design.mdwn create mode 100644 doc/devblog/day_162__routing_sim_and_massive_contribution_landed.mdwn create mode 100644 doc/devblog/day_163__request_and_routing_design.mdwn create mode 100644 doc/devblog/day_164__back.mdwn create mode 100644 doc/devblog/day_165__sshpassword_merged.mdwn create mode 100644 doc/devblog/day_166__catching_up.mdwn create mode 100644 doc/devblog/day_167__growing_the_community_of_git-annex_contributors.mdwn create mode 100644 doc/devblog/day_168__backlog_continued.mdwn create mode 100644 doc/devblog/day_169-171__juggling.mdwn create mode 100644 doc/devblog/day_172__.mdwn create mode 100644 doc/devblog/day_173-174__android_rebootstrap.mdwn create mode 100644 doc/devblog/day_175__encoding_day.mdwn create mode 100644 doc/devblog/day_176__mostly_a_day_off.mdwn create mode 100644 doc/devblog/day_177__enabling.mdwn create mode 100644 doc/devblog/day_177__enabling/comment_1_820d29f84dade09b0e7bb7435c52fcb8._comment create mode 100644 doc/devblog/day_178-179__screencast_and_what_next.mdwn create mode 100644 doc/devblog/day_178-179__screencast_and_what_next/comment_1_eeba788fed45cb22f9cc2a738ceaa074._comment create mode 100644 doc/devblog/day_178-179__screencast_and_what_next/comment_2_d44e67e34615c7b00e29f307556cdd06._comment create mode 100644 doc/devblog/day_180__porting.mdwn create mode 100644 doc/devblog/day_180__porting/comment_1_133875f4435a298b85ddfb8a2cc11a7a._comment create mode 100644 doc/devblog/day_181__tricky_merge.mdwn create mode 100644 doc/devblog/day_182__service.mdwn create mode 100644 doc/devblog/day_183__rubbing_sticks_together.mdwn create mode 100644 doc/devblog/day_184__windows_month.mdwn create mode 100644 doc/devblog/day_185__service.mdwn create mode 100644 doc/devblog/day_186__cracked_it.mdwn create mode 100644 doc/devblog/day_186__cracked_it/comment_1_288b736adf392acd0f45667b2980138d._comment create mode 100644 doc/devblog/day_186__cracked_it/comment_2_d1d79e93ac420f6b3a6f8a622e8e00bd._comment create mode 100644 doc/devblog/day_186__cracked_it/comment_3_8ca17a51b10b4e4a63d0672d5ce29024._comment create mode 100644 doc/devblog/day_187__release_prep.mdwn create mode 100644 doc/devblog/day_187__release_prep/comment_1_206692d16177c2a9ca11c0eeff545697._comment create mode 100644 doc/devblog/day_187__release_prep/comment_2_961fb35d9cf7d5e518f8d0bddb8626a6._comment create mode 100644 doc/devblog/day_188__back_sans_laptop.mdwn create mode 100644 doc/devblog/day_189__finally_working_again.mdwn create mode 100644 doc/devblog/day_190__fun_fixes.mdwn create mode 100644 doc/devblog/day_191__semidistracted.mdwn create mode 100644 doc/devblog/day_192__release_day.mdwn create mode 100644 doc/devblog/day_193-194__ugly_bug.mdwn create mode 100644 doc/devblog/day_195-196__catching_up.mdwn create mode 100644 doc/devblog/day_197__autobuilder_rescuscitation.mdwn create mode 100644 doc/devblog/day_198__branching_out.mdwn create mode 100644 doc/devblog/day_198__branching_out/comment_1_91ce3dc707ba1ba7c5d9e57e20ffce40._comment create mode 100644 doc/devblog/day_199__ten_minute_cycle.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_12_7d507b6f87085a19d8dd5014f580922b._comment create mode 100644 doc/direct_mode/comment_13_5169c5541970d3b3bc1e080e07539b22._comment create mode 100644 doc/direct_mode/comment_13_55108ac736ea450df89332ba5de4a208._comment create mode 100644 doc/direct_mode/comment_14_03a02e689d92faa596de98e02b2ffe28._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/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_7_acd64ce1b08a97ddf730622272e9f611._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_8_9baacb14fc5eb449cb13e0b4a4995fb0._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/A_tiny_filesystem__63__.mdwn create mode 100644 doc/forum/A_tiny_filesystem__63__/comment_1_993e3f5dbe4bcbb5b7bd9e08ab9554f3._comment create mode 100644 doc/forum/A_tiny_filesystem__63__/comment_2_af57591d42868c8aa1cc1eda43ca8b98._comment create mode 100644 doc/forum/A_tiny_filesystem__63__/comment_3_3869c0472b50d7cf5e29ac0720f4f20f._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:_Encrypted_Remotes__63__.mdwn create mode 100644 doc/forum/Android:_Encrypted_Remotes__63__/comment_1_6b16cd372a9bd4f99d4c8b09a82ce3ed._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/Android_version_does_not_sync.mdwn create mode 100644 doc/forum/Android_version_does_not_sync/comment_1_ed9e33eef2c6d651847dca9d3f7a63f6._comment create mode 100644 doc/forum/Android_version_does_not_sync/comment_2_4eafd3e989611f835c489b379bd6ec8a._comment 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/Annex_slow_on_Windows__47__direct_mode.mdwn create mode 100644 doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_1_d80839f4582fc2a6269db31e30e1dbab._comment create mode 100644 doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_2_593e1e01b70a2b6a15ad6bca09a80c7b._comment create mode 100644 doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_3_c4e4c596f31aa97645fe1e1527dc2c31._comment create mode 100644 doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_4_92db0b99ada9af15a5383da41397ebd7._comment create mode 100644 doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_5_3d628c9db9ebdfd5bff92af105c47719._comment create mode 100644 doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_6_db7965fa928c093233769ed52b2fcd43._comment create mode 100644 doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_7_674f52c5e5484207db403b18efc986c6._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_dropping_files.mdwn create mode 100644 doc/forum/Automatically_dropping_files/comment_1_f5fc608f9cb0edf3272b586b62050637._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/Basic_set_up_with_one_remote.mdwn create mode 100644 doc/forum/Basic_set_up_with_one_remote/comment_1_3ad06a0dbebf62e6440f549e77af59b6._comment create mode 100644 doc/forum/Basic_set_up_with_one_remote/comment_2_59e18e759c907b8adabf8c34eef08065._comment create mode 100644 doc/forum/Basic_set_up_with_one_remote/comment_3_5221a713ee3f65fa2740c9fa6cb1db0f._comment create mode 100644 doc/forum/Basic_set_up_with_one_remote/comment_4_62e554a546e4b50d211f5f65446fd289._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_approach_for_central_sharing_and_multiple_users.mdwn create mode 100644 doc/forum/Best_approach_for_central_sharing_and_multiple_users/comment_1_48ffb50b92588daec6887bf08f1b97f5._comment create mode 100644 doc/forum/Best_approach_for_central_sharing_and_multiple_users/comment_2_6b9a20f9707da9d2cfc3697a538d6935._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/Big_repository_vs._multiple_small.mdwn create mode 100644 doc/forum/Big_repository_vs._multiple_small/comment_1_8e21ee3c674ef6e595bdab53dd5c2356._comment create mode 100644 doc/forum/Big_repository_vs._multiple_small/comment_2_656c62351502492d20e8490242e51169._comment create mode 100644 doc/forum/Big_repository_vs._multiple_small/comment_3_e9c44ea364513f090844f46af2ea46a1._comment create mode 100644 doc/forum/Big_repository_vs._multiple_small/comment_4_82e13580426dc648688e4c26e7ed91ec._comment create mode 100644 doc/forum/Big_repository_vs._multiple_small/comment_5_632aceb71dc6a4a9a4bb03de25a9b21a._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_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__.mdwn create mode 100644 doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__/comment_1_a3fbae205c0312436f8861f432643811._comment create mode 100644 doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__/comment_2_de49cf261c644a6e7f6ac881a48d4e6c._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/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__.mdwn create mode 100644 doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__/comment_2_793b3d9f78562f3aecf27dd926bbcf82._comment create mode 100644 doc/forum/Checkout_only_some_files_with_the_assistant.mdwn create mode 100644 doc/forum/Checkout_only_some_files_with_the_assistant/comment_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment create mode 100644 doc/forum/Checkout_only_some_files_with_the_assistant/comment_2_bf095ff5b5af95b062ae1f7da566a279._comment create mode 100644 doc/forum/Checkout_only_some_files_with_the_assistant/comment_3_7c026e36e1cdd52053c34638c87d793c._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/Comparison_with_other_big_files_solutions.mdwn 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/Corrupt_Repository_Invalid_Object.mdwn create mode 100644 doc/forum/Corrupt_Repository_Invalid_Object/comment_1_b7fd4b6212b50400342931e70684b96c._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/Distributing_data_to_a_set_of_drives.mdwn create mode 100644 doc/forum/Distributing_data_to_a_set_of_drives/comment_1_f1fa72879f4e1db13bf59dea33c91624._comment create mode 100644 doc/forum/Distributing_data_to_a_set_of_drives/comment_2_e13b4e5c1e6f1f503f93d521b504d5c1._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_Content_Remote_Daemon_.mdwn create mode 100644 doc/forum/Encrypted_Content_Remote_Daemon_/comment_1_96f63e509e23c081c48302274e21db78._comment create mode 100644 doc/forum/Encrypted_Content_Remote_Daemon_/comment_2_acd0ffdc3f5079265858073c2af81557._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/Fast_cloning_a_repo_initially.mdwn create mode 100644 doc/forum/Fast_cloning_a_repo_initially/comment_1_0db0caafe30dd1b6f15fb1679dec8f9f._comment create mode 100644 doc/forum/Fast_cloning_a_repo_initially/comment_2_e17abc209c2b3ba20158be76801ce04a._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/Getting_the_status_of_a_remotely_changed_annex_file.mdwn create mode 100644 doc/forum/Getting_the_status_of_a_remotely_changed_annex_file/comment_1_e323c21d27bb0946993ba1438429c457._comment create mode 100644 doc/forum/Git-Annex_with_Asustor_NAS.mdwn create mode 100644 doc/forum/Git-Annex_with_Asustor_NAS/comment_1_44445200e5b716caeec225972a5d5dce._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/GitBlit_as_a_centralized_repository.mdwn create mode 100644 doc/forum/GitBlit_as_a_centralized_repository/comment_1_06bedf5fbac45415e0cc81f41b25a5a0._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_Assistant_won__39__t_backup_files_to_removable_drive.mdwn create mode 100644 doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_1_a1d1ae9488924b08682b355aff51130d._comment create mode 100644 doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_2_6649077583bc14730a08aaaca7ccb62e._comment create mode 100644 doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_3_f359d9b9356de7ee10b9e725a011cc43._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_repos_in_git_annex__63__/comment_2_8546341a561a5f55216c2f437f8ec0c2._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_change_the_name_of_a_repo_on_S3__63__.mdwn create mode 100644 doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__/comment_1_be74d63e1951f515948d232e096b4862._comment create mode 100644 doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__/comment_2_d54a7163cfe9a94b7ba337860958e5c5._comment create mode 100644 doc/forum/How_to_completely_remove_tracking_of_a_deleted_file_in_direct_mode.mdwn create mode 100644 doc/forum/How_to_completely_remove_tracking_of_a_deleted_file_in_direct_mode/comment_1_c6bd2ef90516dde928ff18ded36df625._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_debug_failing_sync.mdwn create mode 100644 doc/forum/How_to_debug_failing_sync/comment_1_a597b868182e55e5f39394f154740534._comment create mode 100644 doc/forum/How_to_debug_failing_sync/comment_2_db0a5652d76e4e568a4d7808195bc59c._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_get_git-annex_to_forget_a_commit__63__.mdwn create mode 100644 doc/forum/How_to_get_git-annex_to_forget_a_commit__63__/comment_1_65471c42e163ac8ee6ec109f1397271b._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_make_a_server_store_the_files.mdwn create mode 100644 doc/forum/How_to_make_a_server_store_the_files/comment_1_20196067475918e788afa0debc4d5ce5._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_commit_message_in_direct_mode.mdwn create mode 100644 doc/forum/Manual_commit_message_in_direct_mode/comment_1_32f95eefec25bb127ed96248446c21b1._comment create mode 100644 doc/forum/Manual_commit_message_in_direct_mode/comment_2_bf1d10067379c802ac5020d8becd6d35._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/MegaAnnex_not_working..mdwn create mode 100644 doc/forum/MegaAnnex_not_working./comment_1_5aa3fd366d4c78ca79bb58005a49791c._comment 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/Modification_time_of_files_retained_in_synchronized_remote_copies__63__.mdwn 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/Need_to_recover_unused_files_because_of_bad_sync__63__.mdwn create mode 100644 doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_1_af0ed0730645c1e3c9a4946acd48c18a._comment create mode 100644 doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_2_12f3c2bb2458b69e6355c8f94bab868f._comment create mode 100644 doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_3_b233b4daac32c452776e1e3d9a29f2cc._comment create mode 100644 doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_4_8e079e92929dcfdf19f6adec16f800e5._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_default_sshd_behaviour_has_limited_paths_set/comment_1_a136ff877389f0930c066ba118edd9fd._comment 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/Performance_implications_of_triply_nested_objects_directory.mdwn create mode 100644 doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_1_068a8f120d188b8fa5d3e5b687fd02dc._comment create mode 100644 doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_2_cc0f5be21fd1523bdddc7bcf6ff04435._comment create mode 100644 doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_3_1133795276371c86cdd52b25a8b20c52._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_using_submodules_with_git-annex__63__/comment_2_26f6581b5969eb2cb77495c40de88951._comment create mode 100644 doc/forum/Problems_when_cloning_a_repository.mdwn create mode 100644 doc/forum/Problems_when_cloning_a_repository/comment_1_191c091c384d8d97d24f8a77e8ff90ee._comment create mode 100644 doc/forum/Problems_when_cloning_a_repository/comment_2_74ccbb09677444478074e9eab405fbaf._comment create mode 100644 doc/forum/Problems_when_cloning_a_repository/comment_3_3436e26dd9fe07233a070d4e95d81cdf._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/Recover_files__44___annex_stuck.mdwn create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_10_6d85c3ec73ddc0682d9643f4d5eeda70._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_11_52e799bb6f24a1ebed58fad6cebd3a71._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_12_686a285bc7e950aae67856c47e7cb21e._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_13_a4d62d494b340458e6535d573bade965._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_14_c10f0fe1440ccd170804a433db2267ee._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_15_14446cafac6c33a3f95b5344c42c0bef._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_16_63c19f58b7e95e39ba25a735bdcc0bcf._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_17_8e5c7572ab8d1f0e41fedf6f805b942a._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_18_e5357c63107f79571bd3ff609b4406a7._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_19_3316652073710f39965cd49ceea5c4ff._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_1_d605f755c363d56cf5f1060ad06ee173._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_2_f3ee184a4d3b8d82a8a362a6c03a54a3._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_3_341b47663d133411587ec70ef2b178c6._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_4_66c0d9284d5edbac189a64b03c4fe50a._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_5_8b32f6597f447f88bee7a80698fb4df6._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_6_4cc81169e99a453cdb6e83e57e638f37._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_7_2d104cf4682e04906f8ca0ced7288cf1._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_8_d356c4fce9f1197e5292f9dedf85bbc9._comment create mode 100644 doc/forum/Recover_files__44___annex_stuck/comment_9_856c7e1575f5d99530ecd54004315487._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_SSH_+_supply_key.mdwn create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_10_8bbd0b6488c23ce8b182bd6b1765c94b._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_1_cac35ac1ac0b300ddfac5ffc74291bce._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_2_e9803dd1794b4d078efa9435ff5ba295._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_3_1c3beb859e76cb69d2bacd2473ec72b7._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_4_1c541fc9a44e5cfb13c7d3ef0eeba2c7._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_5_4dbd5605f2638de0a3edfb3886a47938._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_6_a9c5b424a6acb2da152bf87b2e7617bb._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_7_93b7c2a5947fb6904c88cd5c120e404c._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_8_beaa350751eca4642545d1b83e528dd7._comment create mode 100644 doc/forum/Restricting_SSH_+_supply_key/comment_9_2faceeaf0d39f82e5d624eae19e4ca53._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/Retrieve_previous_version_in_direct_mode/comment_5_1360b936aa389a0ab5e5e453824b2ece._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/Revert_to_a_precedent_state_in_direct_mode.mdwn create mode 100644 doc/forum/Revert_to_a_precedent_state_in_direct_mode/comment_1_1ae9f7defbab44621c3108973a4f683a._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/Sending_requests_across_the_network.mdwn create mode 100644 doc/forum/Sending_requests_across_the_network/comment_1_8ff713d4c968705061bf2044ea0fe5a0._comment create mode 100644 doc/forum/Sending_requests_across_the_network/comment_2_cb29e5346a8775d87d30b18b7fc005a7._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/Somehow_have_lots_of_directories_in_root:_000...ffff.mdwn create mode 100644 doc/forum/Somehow_have_lots_of_directories_in_root:_000...ffff/comment_1_20147b287fd995fa8ac9e868b5974d8a._comment create mode 100644 doc/forum/Special_remote_public_key_encryption_issue.mdwn create mode 100644 doc/forum/Special_remote_public_key_encryption_issue/comment_1_a9caafea017a3c148f89d4ddeee15a4c._comment create mode 100644 doc/forum/Special_remote_public_key_encryption_issue/comment_2_adfa582d611ca501e21110282df07315._comment create mode 100644 doc/forum/Special_remote_public_key_encryption_issue/comment_3_eac16bf98a6e87461ba2f3ab7e990b2b._comment create mode 100644 doc/forum/Special_remote_public_key_encryption_issue/comment_6_097f52aaf178340b3abb5bfc80f0d447._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/Ssh_remote_on_NAS.mdwn create mode 100644 doc/forum/Ssh_remote_on_NAS/comment_1_1dd8a0d0e70a1fb36fce62e89c99b404._comment create mode 100644 doc/forum/Ssh_remote_on_NAS/comment_2_261601313d8825c52322949b8509bc74._comment create mode 100644 doc/forum/Ssh_remote_on_NAS/comment_3_ed602f4f972b78bce4f62bdfca8cfe47._comment create mode 100644 doc/forum/Standard_groups__47__preferred_contents.mdwn create mode 100644 doc/forum/Starting_assistant_from_CLI.mdwn create mode 100644 doc/forum/Starting_assistant_from_CLI/comment_1_afd51ddb0f1bb3cac528e1d96829ef83._comment create mode 100644 doc/forum/Starting_assistant_from_CLI/comment_2_76c34c00cf2065809b15a594023a688b._comment create mode 100644 doc/forum/Starting_assistant_from_CLI/comment_3_f7826867f78b1adbfc2dad2fad4d6720._comment create mode 100644 doc/forum/Starting_assistant_from_CLI/comment_4_fa7055a232a1dcb743db47308f7acf0b._comment create mode 100644 doc/forum/Storing_git_repos_in_git-annex.mdwn create mode 100644 doc/forum/Storing_git_repos_in_git-annex/comment_1_ac7b52c0b0f75d79760ffe6a9b5c8759._comment create mode 100644 doc/forum/Storing_git_repos_in_git-annex/comment_3_3bec1f02ff1a61791e3cbb428c7acb4c._comment create mode 100644 doc/forum/Storing_git_repos_in_git-annex/comment_4_76ddbd27cc2f3785bb5aaebb0bb6e087._comment create mode 100644 doc/forum/Storing_git_repos_in_git-annex/comment_5_f9520cbc6669622aa342acad35581943._comment create mode 100644 doc/forum/Storing_git_repos_in_git-annex/comment_9_d5676400e7148b7d3408f2bdb3d54b7d._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_only_what_is_not_available_from_my_central_git_repo.mdwn create mode 100644 doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo/comment_1_b31d02c97447996495de73705ac39f71._comment create mode 100644 doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo/comment_2_098465ae8af32931779d2cd63750d5dc._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/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_2_f9eef3019fe690e90c1228d62a16f70a._comment create mode 100644 doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_3_7fb74f7fab6c1baff4ffc270cf15ef0a._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/View_performance_with_7__44__000_files.mdwn create mode 100644 doc/forum/View_performance_with_7__44__000_files/comment_1_e45ea752100d09d29efb6136a722eab3._comment create mode 100644 doc/forum/View_performance_with_7__44__000_files/comment_2_b1942eed65e9b5c046095a094191a38c._comment create mode 100644 doc/forum/View_performance_with_7__44__000_files/comment_3_e6e19339c9d72cf8eaae32ef4269e850._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/Walkthrough_for_direct_mode__63__.mdwn create mode 100644 doc/forum/Want_to_stop_using_Git-Annex.mdwn create mode 100644 doc/forum/Want_to_stop_using_Git-Annex/comment_1_32e37515bd4f5d22ff9aedd3c9d98046._comment create mode 100644 doc/forum/Want_to_stop_using_Git-Annex/comment_2_e29e6d052ef3677ad7d5615721f3fe33._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/Where_is_the_content__63__.mdwn create mode 100644 doc/forum/Where_is_the_content__63__/comment_1_812e1cf740cbfa449ab3ef4dd5f2df08._comment create mode 100644 doc/forum/Where_is_the_content__63__/comment_2_5e2cfdfab6c4f84fe7a19447b417b5a7._comment create mode 100644 doc/forum/Where_is_the_content__63__/comment_3_bd4cbc8f256a94ffde4f57d2c406a9ec._comment create mode 100644 doc/forum/Where_is_the_content__63__/comment_4_a36b35d47472b5db779b0489bf3d4893._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/Workflow_for_adding_files.mdwn create mode 100644 doc/forum/Workflow_for_adding_files/comment_1_a60dae97db827bc641d6256d1f382b5f._comment create mode 100644 doc/forum/Workflow_for_adding_files/comment_2_28dd15ac50f79fb07bacf8b8326c7edc._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/__171__Locking__187___files_until_synced.mdwn create mode 100644 doc/forum/__171__Locking__187___files_until_synced/comment_1_8bf59f47fee0a8d5741fe209b5899863._comment create mode 100644 doc/forum/__171__Locking__187___files_until_synced/comment_2_0c683547a6178e4303f0b1ed1f5605a5._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__Preseeding__34___a_special_remote.mdwn create mode 100644 doc/forum/__34__Preseeding__34___a_special_remote/comment_1_b0c46d0eba900d0f6169a2c698d7a222._comment create mode 100644 doc/forum/__34__Preseeding__34___a_special_remote/comment_2_5e63f5e6f45c11cc86b293ce8acad77f._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__git_annex_lock__34___very_slow_for_big_repo/comment_4_a4fd212cb066cd53d0d66eb09f3b39a8._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/__91__announce__93___metadata_extration_utility.mdwn 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_created_encrypted__backup_remote:_Howto_restore__63__/comment_3_1ecea12a4be5ad09013cddb62df6ab20._comment create mode 100644 doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_4_af4bc222d1479482bd83952353c97f05._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/best_practices_for_importing_photos__63__.mdwn create mode 100644 doc/forum/best_practices_for_importing_photos__63__/comment_1_37f0ae4b552ec2a4a144ddcdc17c8453._comment create mode 100644 doc/forum/best_practices_for_importing_photos__63__/comment_2_7f96f0fe0fc073321bd7c5bbd9048425._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/comprehension_question:_repository_vs._working_copy_in_direct_mode.mdwn 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/could_not_read_from_remote_repository/comment_2_cf7d5e231675921c3d98faab3613c92f._comment create mode 100644 doc/forum/differenc_in_webapp_icons__63__.mdwn create mode 100644 doc/forum/differenc_in_webapp_icons__63__/comment_1_c38e2692b13a1b76777bf88312a03966._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_14_92b1e8956513dbf52da31cec3f58e2c5._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_15_839e29d41de9dcc8f01dfdc585a51d12._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/downloading_from_moodle.mdwn create mode 100644 doc/forum/downloading_from_moodle/comment_1_3f677130d268de4288e87cfa86ea055c._comment create mode 100644 doc/forum/downloading_from_moodle/comment_2_dcef60ec144f123dadd165fb602ab950._comment create mode 100644 doc/forum/downloading_from_moodle/comment_3_d3efb767bf9b20f96242dcf64817bd4b._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/duplicated_content___40__user_error__41__._How_to_fix__63__.mdwn create mode 100644 doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_1_bb6d749b758b17178227929bf7327fe1._comment create mode 100644 doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_2_d834df30633f7d5569797ee818cf38c3._comment create mode 100644 doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_3_1e02eff33c9fa7bea03aa6d58b910175._comment create mode 100644 doc/forum/empty_directory_handling.mdwn create mode 100644 doc/forum/empty_directory_handling/comment_1_34ac97b9337b6230ed8a4748203fe543._comment create mode 100644 doc/forum/empty_directory_handling/comment_2_73a39e28d5a09ac342cb4195d263d91e._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:_refs__47__heads__47__git-annex_does_not_point_to_a_valid_object__33__.mdwn create mode 100644 doc/forum/error:_refs__47__heads__47__git-annex_does_not_point_to_a_valid_object__33__/comment_1_d370b044da3bfebf9e4c90ce1e243587._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/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory.mdwn create mode 100644 doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_1_d98a155fa01d10ecff9058d79290156d._comment create mode 100644 doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_2_3b9ea7a1254ac5b50a5ab59cd331ec3f._comment create mode 100644 doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_3_5ee300034819c5825c676cd7e3af659f._comment create mode 100644 doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_4_cf7f5c91d3c15f72d2a714b7362c1197._comment 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/folder_size_question.mdwn create mode 100644 doc/forum/folder_size_question/comment_1_782cbf836335d86ff29853c34f00fec3._comment create mode 100644 doc/forum/folder_size_question/comment_2_391aa62e4d8c496a58be4707522d8edb._comment create mode 100644 doc/forum/folder_size_question/comment_3_1e850dbe36fafe0505b60dd2ce0bd5d7._comment create mode 100644 doc/forum/folder_size_question/comment_4_907f3b1cfe745abf94a6a8ba0dbd4396._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/ghost_semitrusted_repositories.mdwn create mode 100644 doc/forum/ghost_semitrusted_repositories/comment_1_99bea1a964da9c5603b8cfbdc19bcde8._comment create mode 100644 doc/forum/ghost_semitrusted_repositories/comment_2_fe5fe5539d06c6b1ef69f3ed805f1ab4._comment create mode 100644 doc/forum/ghost_semitrusted_repositories/comment_3_588325ef52c80cfc67d1dd80a9d5bd13._comment create mode 100644 doc/forum/git-annes_assistant_+_MAC_OSX_questions.mdwn create mode 100644 doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_1_e661f31acd08a6459842f7f95e5c062b._comment create mode 100644 doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_2_e71a9d1fcf1f945fec0b7834b6038e91._comment create mode 100644 doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_3_372d9da8295d093b8b316f0a48b60ee1._comment create mode 100644 doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_4_573537a49e082515bfb1be84c91b5d1b._comment create mode 100644 doc/forum/git-annex:_map:_1_failed.mdwn create mode 100644 doc/forum/git-annex:_map:_1_failed/comment_1_35ff3256e823ab8cfc53276a2123ad5f._comment create mode 100644 doc/forum/git-annex:_map:_1_failed/comment_2_b0826073ebbd2847f4ab0d9bdba2dce5._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_sync_content_available_from_which_version__63__.mdwn create mode 100644 doc/forum/git-annex_sync_content_available_from_which_version__63__/comment_1_104e1b7e7643844f221f85dcbe9c9c4b._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_-_Changing_repository_information.mdwn create mode 100644 doc/forum/git_annex_assistant_-_Changing_repository_information/comment_1_cde71a410200a7478180748fdcde0352._comment 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_prevent_accidentally_running___96__git_add__96____63__.mdwn create mode 100644 doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_1_440dcd19ea2512f968858b780c2a2913._comment create mode 100644 doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_2_e9b70386774996a3d0446faaa3219120._comment create mode 100644 doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_3_3dbd76accad2df2fff14b55452c828ef._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/ignore_changes_made_by_a_remote/comment_2_dff49b72f7e072fddaf68584beb97f3c._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/misctmp_filling_up.mdwn create mode 100644 doc/forum/misctmp_filling_up/comment_1_2739dec72fe0950dd070c8fab9fbd751._comment create mode 100644 doc/forum/misctmp_filling_up/comment_2_440081b5e2b9b5b19e8cd5db3649a976._comment 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_10_5f9735ec62478c99b8c814055206cff0._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_11_859c44046b00fe885f6878cfe0e46360._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_12_35ade68d62e95036344ad33db3279c21._comment 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/overmounting_repository_at_home.mdwn create mode 100644 doc/forum/overmounting_repository_at_home/comment_1_399ac5014c489698e1e45deec4db7311._comment create mode 100644 doc/forum/overmounting_repository_at_home/comment_2_d006d89ba204568cdee0731b6251ec1a._comment create mode 100644 doc/forum/overmounting_repository_at_home/comment_3_3734b50c37cbec675813cbeca7bf4ce9._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_and_multiple_replication_problems/comment_5_8df6cc8b72e0e78c7380f7d471124498._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/pgp_issue_in_log_file_after_upgrade_to_5.20140517.mdwn create mode 100644 doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517/comment_1_807d7da99f732f2fa5f9d3cb1ba9f1a1._comment create mode 100644 doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517/comment_2_92a7509fc42ab2347d57f080081d14b5._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/public__44___read_only_annex_without_location_tracking.mdwn create mode 100644 doc/forum/public__44___read_only_annex_without_location_tracking/comment_1_47262f048a87fd6b781090f880a9bf99._comment create mode 100644 doc/forum/public__44___read_only_annex_without_location_tracking/comment_2_ec3ff6487c9e5c89c7e508d72518bd50._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/recovery_from_failed_merge.mdwn create mode 100644 doc/forum/recovery_from_failed_merge/comment_1_84e5b55d473d16bc9bdba5d88dc29bc3._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/remembering_state.mdwn create mode 100644 doc/forum/remembering_state/comment_1_4a6ac5f50dfa5a17a0f0ccd0c2e7a466._comment create mode 100644 doc/forum/remembering_state/comment_2_1b02d3713a2986bc027d166589a11c3f._comment create mode 100644 doc/forum/remembering_state/comment_3_b48775ea1e90b061b084f61a4a9baca5._comment create mode 100644 doc/forum/remembering_state/comment_4_cbebcc6ed4bdae6815c0576475e96f6a._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/repo_corruption_in_usb_external_drive.mdwn create mode 100644 doc/forum/repo_corruption_in_usb_external_drive/comment_1_d9122bb0cc3551d92877c299a25b9c9e._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.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_3_84aceb9a9d3e5bd14c044861f47e3b9d._comment create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_4_2cd17d01edeb230197865e6ea0884de0._comment create mode 100644 doc/forum/rsync_asking_for_an_unknown_password.mdwn create mode 100644 doc/forum/rsync_asking_for_an_unknown_password/comment_1_f23d1c04a27625089eaef5b4bb7f8456._comment create mode 100644 doc/forum/rsync_asking_for_an_unknown_password/comment_2_ce4b399fdb2f04e30bd8a951994f1c80._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_key_setup_woes_in_Android.mdwn create mode 100644 doc/forum/ssh_key_setup_woes_in_Android/comment_1_f16fbff27a449409699f3dbcf9590622._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/ssh_vs_cifs__47__webdav.mdwn 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/sync_stages_deletions_on_remote.mdwn create mode 100644 doc/forum/sync_stages_deletions_on_remote/comment_1_2b639066095e450c2d9be3b2775d24b3._comment create mode 100644 doc/forum/sync_stages_deletions_on_remote/comment_2_da5775526a2a476b6ead1cd1a735b8bd._comment create mode 100644 doc/forum/sync_stages_deletions_on_remote/comment_3_9e07593228915936fadcf90373be9f4e._comment create mode 100644 doc/forum/sync_stages_deletions_on_remote/comment_4_e5a3dc34c6229ec40bc999c3cab28041._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/taskwarrior/comment_2_4b3d70501763f6d36c927ae37bbd33c2._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/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_9_2592749c2f02b3e151896e31acba359b._comment create mode 100644 doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn create mode 100644 doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment create mode 100644 doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_2_82dc18ed14879936d04133f248879fb9._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/update_via_cabal_fails.mdwn create mode 100644 doc/forum/update_via_cabal_fails/comment_1_e1235dc2acd3bac3dd51b7614dabbb88._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_case:_unique_indentifier_of_objets___40__doi_like__41__.mdwn create mode 100644 doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__/comment_1_955f3aac12c1ddb41267c5a23ccb79e3._comment create mode 100644 doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__/comment_2_0aff36755f49afddd5482a602a1ccd2b._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/views___40__branches__41___never_get_deleted.mdwn create mode 100644 doc/forum/views___40__branches__41___never_get_deleted/comment_1_ff53fa0b5f0c4a6554a37e3309e26925._comment create mode 100644 doc/forum/views___40__branches__41___never_get_deleted/comment_3_1d4a3f4e83b288262e291262a6636602._comment create mode 100644 doc/forum/views___40__branches__41___never_get_deleted/comment_3_4e96e5325fd12e48f190fe551a6ac07e._comment create mode 100644 doc/forum/views___40__branches__41___never_get_deleted/comment_4_a4764b5bfb08ebe90430ea14fcb6e8e0._comment create mode 100644 doc/forum/views___40__branches__41___never_get_deleted/comment_5_02e08dffb01246010b390aeef8f32234._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/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout.mdwn create mode 100644 doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout/comment_1_c0d9758be80d1a349ffe82c80075bebd._comment create mode 100644 doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout/comment_2_c28dae2eb0ab825ee6d43735e04a18a3._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_and_manual_mode/comment_3_f0739bf4304a91a5d4ec33ac2421c966._comment create mode 100644 doc/forum/webapp_does_not_start.mdwn create mode 100644 doc/forum/webapp_does_not_start/comment_1_dd27d30ce305562a1552f46c87b1cd27._comment create mode 100644 doc/forum/webapp_does_not_start/comment_2_ef37f40288a1181ca619ae13b0f7a994._comment create mode 100644 doc/forum/webapp_does_not_start/comment_3_6e625dba9f7fa36bf9c7e9d77fbadeff._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/whereis_command_with_file_names_instead_of_hashes.mdwn create mode 100644 doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_1_4eaca07152916adc18032fb404e4dd92._comment create mode 100644 doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_2_94b43ac23ff8332b35723422eede8997._comment create mode 100644 doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_3_45ffa6dd17667ecd6685f85f34046eff._comment create mode 100644 doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_4_d459fbcf0db59b821ae67f4949e48103._comment create mode 100644 doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_5_e52a8c9cb418fbc2e2cba71f37bd44ad._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_10_4b565e73f02f0e84bdf7e686b0d7bf5f._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_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment create mode 100644 doc/install/Debian/comment_15_20d8271ba3f6cfe3c8849c3d41607630._comment create mode 100644 doc/install/Debian/comment_16_89f67da4a4a6a626a7db9c6674b244b6._comment create mode 100644 doc/install/Debian/comment_17_ef7f3e88d61833e51f0302e938343818._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_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment create mode 100644 doc/install/Debian/comment_8_5b5a3b0e8abe8831a6a15a4e258d14fd._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/Fedora/comment_7_4832d271dcc63a6cd1c40fe38ad5e367._comment create mode 100644 doc/install/Fedora/comment_8_80e167cde1a6511683a8f6e8029c0da6._comment create mode 100644 doc/install/FreeBSD.mdwn create mode 100644 doc/install/Gentoo.mdwn create mode 100644 doc/install/Homebrew.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/NixOS/comment_1_4e487ddd2654a8a992c1538b9c3bf003._comment 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_36_2a095a5af53a356bd29abd22a9cb1bea._comment create mode 100644 doc/install/cabal/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment create mode 100644 doc/install/cabal/comment_38_5c1e96221154a4ae4ebd636232044ced._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/comment_1_0aa16754fb08d8f2a54c8c3f78b6c187._comment create mode 100644 doc/install/fromscratch.mdwn create mode 100644 doc/install/fromscratch/comment_1_9d085e460553fa045999ab7cb945cdec._comment create mode 100644 doc/install/fromscratch/comment_2_b7954521d9ab40622b665f278dd72e17._comment create mode 100644 doc/install/fromscratch/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment 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_5.20140529.mdwn create mode 100644 doc/news/version_5.20140606.mdwn create mode 100644 doc/news/version_5.20140613.mdwn create mode 100644 doc/news/version_5.20140707.mdwn create mode 100644 doc/news/version_5.20140709.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_14_837e3699014b73e8f2bd2a668eea9eef._comment create mode 100644 doc/not/comment_15_ac7396ca125abb80a42f9aaaf61a6ab4._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_22_308afc586b86c66bbb3437d63864d9cb._comment create mode 100644 doc/special_remotes/comment_23_0f5440e0e54cf7ac2a68b1ba115b0930._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/ddar.mdwn 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/glacier/comment_8_a04bb5f27c1a7cfffe881903f973dbec._comment create mode 100644 doc/special_remotes/glacier/comment_9_89c4506e079c299fd098d0fe746d032a._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_10_2c087a132c2203ac20636800bf73dfa7._comment create mode 100644 doc/special_remotes/webdav/comment_11_cde4fccaf551ba1eab8235ebf6654316._comment create mode 100644 doc/special_remotes/webdav/comment_12_76423262fceeced32ab18fa38ed53bdb._comment create mode 100644 doc/special_remotes/webdav/comment_14_2390020fa7daac8a6d3e8b713bd3b8e7._comment 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/webdav/comment_9_b8f17efe524bb45a3e16705996df1265._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_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment create mode 100644 doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment create mode 100644 doc/sync/comment_13_690f66be9cefe28844d8df653b7a0331._comment create mode 100644 doc/sync/comment_14_db342785a4dade30b5b75cb95031bed1._comment create mode 100644 doc/sync/comment_15_168e0ab10b4084e13df1a3058fa7e8a9._comment create mode 100644 doc/sync/comment_16_96096f994fc55f921f2b24b274f998f7._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/buglist.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/ZSH_completion.mdwn 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 100644 doc/tips/automatically_adding_metadata/comment_3_02e5314f827d17d482343e8f22c42fd9._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_21_98a1dacc8d264ff31801e6c5c5f2612d._comment create mode 100644 doc/tips/downloading_podcasts/comment_22_00cc7a2fb936d7ea3d5d3764a1637663._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/file_manager_integration/comment_1_0f82520f415b4715946358658e1799a8._comment create mode 100644 doc/tips/file_manager_integration/comment_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment 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_14_c728f10074d194efa8b2c60e97d275e7._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/googledriveannex/comment_2_c98c00e87bc921158c9c3698fd9f89c9._comment create mode 100644 doc/tips/googledriveannex/comment_3_e7ba5620c0946874f0ae1287f99d1177._comment create mode 100644 doc/tips/googledriveannex/comment_4_239091adaea6ae39fa9a4d9719667a98._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/metadata_driven_views/comment_2_13ae4e3668b693c0eefaca23b88515cf._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/shared_git_annex_directory_between_multiple_users/comment_1_01db8cf9dff016bd8e0498d36f325418._comment create mode 100644 doc/tips/skydriveannex.mdwn create mode 100644 doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment create mode 100644 doc/tips/skydriveannex/comment_1_bf383481b2bbb962fbfe783b9f2f213a._comment create mode 100644 doc/tips/skydriveannex/comment_2_1f747018b35ab8accd2bf0905e6ad926._comment create mode 100644 doc/tips/skydriveannex/comment_3_8b9444006734262693f71e50a40eae1d._comment create mode 100644 doc/tips/skydriveannex/comment_4_8b01dc6ca1082a8c24ff65fec9d759d8._comment create mode 100644 doc/tips/skydriveannex/comment_5_1d220d96945d497f3a93b5d848eb3995._comment create mode 100644 doc/tips/skydriveannex/comment_6_a7a3afdc7eed9a0eda48dcb57f1e87c6._comment create mode 100644 doc/tips/skydriveannex/comment_7_7fcd9c6b5e2a3fc7b753eeac06164036._comment create mode 100644 doc/tips/skydriveannex/comment_8_856eaa1b167033aede91a937099c7833._comment create mode 100644 doc/tips/skydriveannex/comment_9_cfcf767a1bf07957b76d7f44ef8a9500._comment 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_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment create mode 100644 doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._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_Google_Cloud_Storage/comment_2_0843bfb776b8b6d5de4de7fda4489f34._comment create mode 100644 doc/tips/using_Google_Cloud_Storage/comment_3_9738f145014d8eae1f1aae7c39e71d31._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_21_d2feaaf22d41413048dabf706d1b267e._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/using_the_web_as_a_special_remote/comment_5_5ee9717e74ca2afed98e81fc0ea98a95._comment create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_6_dceb15bd656e69eefa3ca975d9d642de._comment create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_7_0bde977c62a53c90cb20491936bc399d._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_a_repository_is_corrupted/comment_1_c3543190eae2af594f3e050057e80db6._comment create mode 100644 doc/tips/what_to_do_when_a_repository_is_corrupted/comment_2_025178c2b11affe2d42a87544b897dc8._comment create mode 100644 doc/tips/what_to_do_when_a_repository_is_corrupted/comment_3_9a6bae9c0326ecc7610f5415db20f49e._comment 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_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo.mdwn create mode 100644 doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_1_6f477af942aeb98683a56bcf0e819a38._comment create mode 100644 doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_2_45c22f596a18d5dc2331cfeef8c767fa._comment create mode 100644 doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_3_cbca264d86fe733b8106a4bf50c0c6ff._comment 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/Bittorrent-like_features/comment_6_489505da4143fb1c2bf21e7af695cdef._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment create mode 100644 doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_9_3f0bfc5a79aa59ac76a6968aacda6655._comment create mode 100644 doc/todo/Chunks_support_in_all_special_remotes.mdwn create mode 100644 doc/todo/Chunks_support_in_all_special_remotes/comment_1_d12604dbeb42bbb6850425d237cb01e7._comment create mode 100644 doc/todo/Deleting_Unused_Files_by_Age.mdwn create mode 100644 doc/todo/Expose_auto-merge_for_manual__44___local_merges.mdwn create mode 100644 doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running.mdwn create mode 100644 doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_1_e5f2630591ffa7758ca4250a061a8589._comment create mode 100644 doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_2_f8a5cc905d5b06bdbb1a778ab866a28c._comment create mode 100644 doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_3_626c629654508d0d948ece849d43ed86._comment create mode 100644 doc/todo/Improve_direct_mode_using_copy_on_write.mdwn create mode 100644 doc/todo/LIst_of_Available_Remotes_in_Webapp.mdwn create mode 100644 doc/todo/LIst_of_Available_Remotes_in_Webapp/comment_1_23fe2f3cd44c4357a385452dcd5eedef._comment 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/Not_working_on_Android-x86/comment_3_6b609af60bf1c477139e40eba5cb0c4e._comment create mode 100644 doc/todo/Pause_all_transfers_in_all_annexes_watched_by_the_assistant.mdwn create mode 100644 doc/todo/Recovering_from_a_bad_sync.mdwn create mode 100644 doc/todo/Recovering_from_a_bad_sync/comment_1_6f5f518a3190534b737203787149ef3c._comment create mode 100644 doc/todo/Recovering_from_a_bad_sync/comment_2_e494df56dcede4d14bcaa4cdbf3da4f5._comment create mode 100644 doc/todo/Recovering_from_a_bad_sync/comment_3_4d4904bcbf97401c7c11338f32577f96._comment create mode 100644 doc/todo/Recursive_addurl_simlar_to_wget_--recursive.mdwn create mode 100644 doc/todo/Recursive_addurl_simlar_to_wget_--recursive/comment_1_4ecd9ddba1b63b571555ec9bef18e2d8._comment 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/Time_Stamping_of_Events_in_Webapp.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_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_2_735afa6f87a93cdf333c17da32010620._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:_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:_disable_auto-repair_for_the_assistant.mdwn create mode 100644 doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_1_3274820a0d1f10c505f15cd29a37b95a._comment create mode 100644 doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_2_2cf5aef3f1d340c4ed6249ef94c1b607._comment create mode 100644 doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_3_6c53d82e62b2d269a941ba967d05adf5._comment create mode 100644 doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn create mode 100644 doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode.mdwn create mode 100644 doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode/comment_1_6c6e192bc0f70a386cd4275f98e1bd6f._comment create mode 100644 doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode/comment_2_8e22cfdbeb2c841870a623cf4c7baf60._comment 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/allow_removing_jabber_configuration.mdwn 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_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_6b71a390fd16f593216793aec590d9a8._comment create mode 100644 doc/todo/assistant_parallel_file_transfers.mdwn create mode 100644 doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn create mode 100644 doc/todo/build_a_user_guide.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/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/custom_f-droid_repo/comment_4_55f05624f0e939f7b8d0c505285e5690._comment create mode 100644 doc/todo/custom_f-droid_repo/comment_6_de4229f04daf48a153e2f44f57a05a3b._comment create mode 100644 doc/todo/do_not_bug_me_about_intermediate_files.mdwn create mode 100644 doc/todo/document_standard_groups_more_extensively_in_the_UI.mdwn 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/fast_migrate.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/git-annex_ignores_GIT__95__SSH.mdwn create mode 100644 doc/todo/git-annex_ignores_GIT__95__SSH/comment_1_958dd21d7e981232f03b4516521ac226._comment create mode 100644 doc/todo/git-annex_ignores_GIT__95__SSH/comment_2_319a7e8122e7bc25d9399ba463a16158._comment create mode 100644 doc/todo/git-annex_ignores_GIT__95__SSH/comment_3_cc1936f18721a912bb77903be6c4a45f._comment 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/hidden_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/integrate_support_for_spideroak_as_archive__47__backup.mdwn create mode 100644 doc/todo/integrate_support_for_spideroak_as_archive__47__backup/comment_1_a47ea814f6d7727bbd0eeca6d1fd3219._comment create mode 100644 doc/todo/keep_annexed_files_for_a_while.mdwn create mode 100644 doc/todo/notifications.mdwn 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/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/read-only_removable_drives.mdwn create mode 100644 doc/todo/read-only_removable_drives/comment_1_979455e3694ae2403134ed6fa2add2fa._comment 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/required_content/comment_3_b16a8e8b45ceee887c8c0167b7859654._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/sharedRepository_mode_not_supported_by_git-annex.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/ssh_special_remote.mdwn create mode 100644 doc/todo/stream_feature__63__.mdwn create mode 100644 doc/todo/support_S3_multipart_uploads.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/unwanted_repository_version_upgrades.mdwn create mode 100644 doc/todo/unwanted_repository_version_upgrades/comment_1_48f71865b65db4574a10e5c32ee22197._comment create mode 100644 doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn create mode 100644 doc/todo/view_git_annex_log_in_webapp.mdwn create mode 100644 doc/todo/view_git_annex_log_in_webapp/comment_1_945054441d93423b2c7b81712b364a3c._comment create mode 100644 doc/todo/view_git_annex_log_in_webapp/comment_2_0f434dfe80e90951870218bc1b76c374._comment create mode 100644 doc/todo/webapp_ssh_setup_should_work_with_locked_down_git-annex-shell_account.mdwn create mode 100644 doc/todo/windows_git-annex_service.mdwn create mode 100644 doc/todo/windows_git-annex_service/comment_11_c3af14453e99dae5425deaa26ca7310e._comment create mode 100644 doc/todo/windows_git-annex_service/comment_11_e2dda1037cc85f03613f2774c139ad56._comment create mode 100644 doc/todo/windows_git-annex_service/comment_12_249a48a241f14f32dab49f381d2de3b3._comment create mode 100644 doc/todo/windows_git-annex_service/comment_12_d3d91ddc00bc275455022d86b779b148._comment create mode 100644 doc/todo/windows_git-annex_service/comment_13_59fbe4d07cdbeb786bae792f9c709ddd._comment create mode 100644 doc/todo/windows_git-annex_service/comment_13_f1d254fe85b0e5cbc7edf9096af4f942._comment create mode 100644 doc/todo/windows_git-annex_service/comment_14_79fc0ff98c5bba2ed616e52e5a58e28f._comment create mode 100644 doc/todo/windows_git-annex_service/comment_14_7d5fdac0084c4742967879f5f0f9fccf._comment create mode 100644 doc/todo/windows_git-annex_service/comment_15_8f10491f8c0a151284e6d81a83eab212._comment create mode 100644 doc/todo/windows_git-annex_service/comment_15_fcd34607116183cc1a764fb307eabe0a._comment create mode 100644 doc/todo/windows_git-annex_service/comment_16_51800fd83cd979b021eabdd4c44cfd61._comment create mode 100644 doc/todo/windows_git-annex_service/comment_16_6a6424f23772e57f1adb1807ca8b93fa._comment create mode 100644 doc/todo/windows_git-annex_service/comment_17_62a1a33c2aaf4b0b8a0149ec526907d7._comment create mode 100644 doc/todo/windows_git-annex_service/comment_18_3a408492107ca6f120b631ce8c41faef._comment create mode 100644 doc/todo/windows_git-annex_service/comment_19_c6cbc8fe9218f90c661cd1026658c939._comment create mode 100644 doc/todo/windows_git-annex_service/comment_20_ca245781a37db5546da3f7204adbeebb._comment 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_11_c91eb7da8ee05064a5bc4a6e2203314b._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:_--maxdepth_option_for_git_annex_find.mdwn create mode 100644 doc/todo/wishlist:_Add_--byte-limit_option.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:_Freeing_X_space_on_remote_Y.mdwn 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:_Restore_s3_files_moved_to_Glacier.mdwn create mode 100644 doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier/comment_1_eb934756cb2af7fa13ad3b5fad7f85b2._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_drop_--relaxed__96__/comment_3_3e830035df580601f038ce3a7003c39d._comment create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_4_e5516689bc128c061dcd66649dc69584._comment create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_5_be740e4b06d9130ae6afc5783da3c0e0._comment create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_6_79d115f95cec46bb51e7fba078524db1._comment create mode 100644 doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_1_fff7cdff9e4bc988139152a799b65c99._comment create mode 100644 doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_2_b8dd92d7710a9d194312058e53c38d21._comment create mode 100644 doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_3_206e319f6d7c6b0d1f05af2475a8b335._comment create mode 100644 doc/todo/wishlist:_add_--symlink_option_to_import.mdwn create mode 100644 doc/todo/wishlist:_add_--symlink_option_to_import/comment_1_d5d853142d401b95577567e3eb43495e._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:_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:_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:_derived_content_support.mdwn create mode 100644 doc/todo/wishlist:_disable_automatic_commits.mdwn create mode 100644 doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn create mode 100644 doc/todo/wishlist:_do_not_import_new_files.mdwn create mode 100644 doc/todo/wishlist:_do_not_import_new_files/comment_1_b41c214599d6601257a9d824cebbffcc._comment create mode 100644 doc/todo/wishlist:_do_not_import_new_files/comment_2_7b26171458baaf5c0057276d2d97e14c._comment create mode 100644 doc/todo/wishlist:_do_not_import_new_files/comment_3_6f80ce6cee4519d4f69193d5086e194a._comment create mode 100644 doc/todo/wishlist:_do_not_import_new_files/comment_4_22a7a03c30174e42e6d8e639e31e1d34._comment create mode 100644 doc/todo/wishlist:_do_not_import_new_files/comment_5_4294e92e2f4efb9dd10b280f5c9843f7._comment 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:_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_diff.mdwn create mode 100644 doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment create mode 100644 doc/todo/wishlist:_git_annex_info_._also_return_numcopies_setting.mdwn 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:_history_of_operations.mdwn create mode 100644 doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._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:_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_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:_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:_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_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_Ubuntu_One/comment_2_17e948acb1e29793cf172cd6def4160b._comment 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: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__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_2_06230669218541ac392d674bedd43176._comment create mode 100644 doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_3_002afd775b82a0ced609c8305803a6c2._comment create mode 100644 doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_4_9e8fdc41fdefcb8be0d6bae7cd4a04a9._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_lan.mdwn create mode 100644 doc/videos/git-annex_assistant_lan/comment_1_df8c8b6d9d63fbf5462b225edbb23c82._comment create mode 100644 doc/videos/git-annex_assistant_lan/comment_2_d4e3122da9c9e27fbe872e09fcde762b._comment create mode 100644 doc/videos/git-annex_assistant_lan/comment_3_d43ee0a335c2f010b437cf28437455c2._comment create mode 100644 doc/videos/git-annex_assistant_lan/comment_4_c710e27db41311b157d8caaafc32dc7e._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/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment 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/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_ddar.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/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/git.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.4.4_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/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/network_2.5.0.0_0001-android-port-fixes.patch create mode 100644 standalone/android/haskell-patches/primitive_0.5.3.0_0001-disable-i386-opt-stuff-to-allow-cross-compilation.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/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/aeson_remove-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/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_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/skein_hardcode_little-endian.patch create mode 100644 standalone/no-th/haskell-patches/vector_hack-to-build-with-new-ghc.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 100644 standalone/trustedkeys.gpg create mode 100755 standalone/windows/build-simple.sh create mode 100755 standalone/windows/build.sh create mode 100644 static/activityicon.gif create mode 100644 static/css/bootstrap-theme.css create mode 100644 static/css/bootstrap.css create mode 100644 static/favicon.ico create mode 100644 static/fonts/glyphicons-halflings-regular.eot create mode 100644 static/fonts/glyphicons-halflings-regular.svg create mode 100644 static/fonts/glyphicons-halflings-regular.ttf create mode 100644 static/fonts/glyphicons-halflings-regular.woff create mode 100644 static/js/bootstrap.js create mode 100644 static/js/jquery.full.js create mode 100644 static/js/jquery.ui.core.js create mode 100644 static/js/jquery.ui.mouse.js create mode 100644 static/js/jquery.ui.sortable.js create mode 100644 static/js/jquery.ui.widget.js create mode 100644 static/js/longpolling.js create mode 100644 static/syncicon.gif create mode 100644 templates/README create mode 100644 templates/actionbutton.hamlet create mode 100644 templates/bootstrap.hamlet create mode 100644 templates/configurators/addbox.com.hamlet create mode 100644 templates/configurators/adddrive.hamlet create mode 100644 templates/configurators/adddrive/combine.hamlet create mode 100644 templates/configurators/adddrive/encrypt.hamlet create mode 100644 templates/configurators/adddrive/setupmodal.hamlet create mode 100644 templates/configurators/addglacier.hamlet create mode 100644 templates/configurators/addia.hamlet create mode 100644 templates/configurators/addrepository.hamlet create mode 100644 templates/configurators/addrepository/archive.hamlet create mode 100644 templates/configurators/addrepository/cloud.hamlet create mode 100644 templates/configurators/addrepository/connection.hamlet create mode 100644 templates/configurators/addrepository/misc.hamlet create mode 100644 templates/configurators/addrepository/ssh.hamlet create mode 100644 templates/configurators/addrepository/xmppconnection.hamlet create mode 100644 templates/configurators/adds3.hamlet create mode 100644 templates/configurators/delete/currentrepository.hamlet create mode 100644 templates/configurators/delete/finished.hamlet create mode 100644 templates/configurators/delete/start.hamlet create mode 100644 templates/configurators/delete/xmpp.hamlet create mode 100644 templates/configurators/edit/nonannexremote.hamlet create mode 100644 templates/configurators/edit/repository.hamlet create mode 100644 templates/configurators/enableaws.hamlet create mode 100644 templates/configurators/enabledirectory.hamlet create mode 100644 templates/configurators/enableia.hamlet create mode 100644 templates/configurators/enablewebdav.hamlet create mode 100644 templates/configurators/fsck.cassius create mode 100644 templates/configurators/fsck.hamlet create mode 100644 templates/configurators/fsck/form.hamlet create mode 100644 templates/configurators/fsck/formcontent.hamlet create mode 100644 templates/configurators/fsck/preferencesform.hamlet create mode 100644 templates/configurators/fsck/status.hamlet create mode 100644 templates/configurators/genkeymodal.hamlet create mode 100644 templates/configurators/main.hamlet create mode 100644 templates/configurators/needconnection.hamlet create mode 100644 templates/configurators/needgcrypt.hamlet create mode 100644 templates/configurators/needglaciercli.hamlet create mode 100644 templates/configurators/newrepository.hamlet create mode 100644 templates/configurators/newrepository/combine.hamlet create mode 100644 templates/configurators/newrepository/first.hamlet create mode 100644 templates/configurators/newrepository/form.hamlet create mode 100644 templates/configurators/pairing/disabled.hamlet create mode 100644 templates/configurators/pairing/local/inprogress.hamlet create mode 100644 templates/configurators/pairing/local/prompt.hamlet create mode 100644 templates/configurators/pairing/xmpp/end.hamlet create mode 100644 templates/configurators/pairing/xmpp/friend/confirm.hamlet create mode 100644 templates/configurators/pairing/xmpp/friend/prompt.hamlet create mode 100644 templates/configurators/pairing/xmpp/self/prompt.hamlet create mode 100644 templates/configurators/pairing/xmpp/self/retry.hamlet create mode 100644 templates/configurators/preferences.hamlet create mode 100644 templates/configurators/rsync.net/add.hamlet create mode 100644 templates/configurators/rsync.net/encrypt.hamlet create mode 100644 templates/configurators/ssh/add.hamlet create mode 100644 templates/configurators/ssh/combine.hamlet create mode 100644 templates/configurators/ssh/confirm.hamlet create mode 100644 templates/configurators/ssh/enable.hamlet create mode 100644 templates/configurators/ssh/error.hamlet create mode 100644 templates/configurators/ssh/expiredpassword.hamlet create mode 100644 templates/configurators/ssh/setupmodal.hamlet create mode 100644 templates/configurators/ssh/testmodal.hamlet create mode 100644 templates/configurators/unused.hamlet create mode 100644 templates/configurators/unused/form.hamlet create mode 100644 templates/configurators/upgrade/android.hamlet create mode 100644 templates/configurators/xmpp.hamlet create mode 100644 templates/configurators/xmpp/buddylist.hamlet create mode 100644 templates/configurators/xmpp/disabled.hamlet create mode 100644 templates/configurators/xmpp/needcloudrepo.hamlet create mode 100644 templates/control/log.hamlet create mode 100644 templates/control/notrunning.hamlet create mode 100644 templates/control/notrunning.julius create mode 100644 templates/control/repairrepository.hamlet create mode 100644 templates/control/repairrepository/done.hamlet create mode 100644 templates/control/repositoryswitcher.hamlet create mode 100644 templates/control/shutdown.hamlet create mode 100644 templates/controlmenu.hamlet create mode 100644 templates/dashboard/main.hamlet create mode 100644 templates/dashboard/metarefresh.hamlet create mode 100644 templates/dashboard/transfers.cassius create mode 100644 templates/dashboard/transfers.hamlet create mode 100644 templates/documentation/about.hamlet create mode 100644 templates/documentation/license.hamlet create mode 100644 templates/documentation/repogroup.hamlet create mode 100644 templates/error.cassius create mode 100644 templates/error.hamlet create mode 100644 templates/notifications/longpolling.julius create mode 100644 templates/page.cassius create mode 100644 templates/page.hamlet create mode 100644 templates/page.julius create mode 100644 templates/repolist.hamlet create mode 100644 templates/repolist.julius create mode 100644 templates/sidebar/alert.hamlet create mode 100644 templates/sidebar/main.hamlet diff --git a/.ghci b/.ghci new file mode 100644 index 0000000000..c5550cee6e --- /dev/null +++ b/.ghci @@ -0,0 +1 @@ +:load Common diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000000..46423bd59b --- /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 0000000000..bb271c5e83 --- /dev/null +++ b/Annex.hs @@ -0,0 +1,291 @@ +{- git-annex monad + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, PackageImports #-} + +module Annex ( + Annex, + AnnexState(..), + new, + run, + eval, + getState, + changeState, + setFlag, + setField, + setOutput, + getFlag, + getField, + addCleanup, + gitRepo, + inRepo, + fromRepo, + calcRepo, + getGitConfig, + changeGitConfig, + changeGitRepo, + getRemoteGitConfig, + withCurrentState, +) where + +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 +#ifdef WITH_QUVI +import Utility.Quvi (QuviVersion) +#endif +import Utility.InodeCache + +import "mtl" Control.Monad.Reader +import Control.Monad.Catch +import Control.Concurrent +import qualified Data.Map as M +import qualified Data.Set as S + +{- 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), + MonadCatch, + MonadThrow, +#if MIN_VERSION_exceptions(0,6,0) + MonadMask, +#endif + 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 ()) + , sentinalstatus :: Maybe SentinalStatus + , useragent :: Maybe String + , errcounter :: Integer + , unusedkeys :: Maybe (S.Set Key) +#ifdef WITH_QUVI + , quviversion :: Maybe QuviVersion +#endif + , 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 + , sentinalstatus = Nothing + , useragent = Nothing + , errcounter = 0 + , unusedkeys = Nothing +#ifdef WITH_QUVI + , quviversion = Nothing +#endif + , 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 + } + +{- Gets the RemoteGitConfig from a remote, given the Git.Repo for that + - remote. -} +getRemoteGitConfig :: Git.Repo -> Annex RemoteGitConfig +getRemoteGitConfig r = do + g <- gitRepo + return $ extractRemoteGitConfig g (Git.repoDescribe 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 0000000000..c19011e2d9 --- /dev/null +++ b/Annex/AutoMerge.hs @@ -0,0 +1,206 @@ +{- git-annex automatic merge conflict resolution + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.AutoMerge + ( autoMergeFrom + , resolveMerge + , commitResolvedMerge + ) where + +import Common.Annex +import qualified Annex.Queue +import Annex.Direct +import Annex.CatFile +import Annex.Link +import qualified Git.LsFiles as LsFiles +import qualified Git.UpdateIndex as UpdateIndex +import qualified Git.Merge +import qualified Git.Ref +import qualified Git +import qualified Git.Branch +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. + - + - Callers should use Git.Branch.changed first, to make sure that + - there are changed from the current branch to the branch being merged in. + -} +autoMergeFrom :: Git.Ref -> (Maybe Git.Ref) -> Git.Branch.CommitMode -> Annex Bool +autoMergeFrom branch currbranch commitmode = do + showOutput + case currbranch of + Nothing -> go Nothing + Just b -> go =<< inRepo (Git.Ref.sha b) + where + go old = ifM isDirect + ( mergeDirect currbranch old branch (resolveMerge old branch) commitmode + , inRepo (Git.Merge.mergeNonInteractive branch commitmode) + <||> (resolveMerge old branch <&&> commitResolvedMerge commitmode) + ) + +{- 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, for later handling by + - the direct mode merge code. + -} +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 + 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 LsFiles.valThem LsFiles.valThem + makelink keyUs + -- Our side is not annexed file, other side is. + (Nothing, Just keyThem) -> resolveby $ do + graftin us file LsFiles.valUs LsFiles.valUs + 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 + replacewithlink dest l + stageSymlink dest =<< hashSymlink l + + replacewithlink dest link = ifM isDirect + ( do + d <- fromRepo gitAnnexMergeDir + replaceFile (d dest) $ makeGitLink link + , replaceFile dest $ makeGitLink link + ) + + {- Stage a graft of a directory or file from a branch. + - + - When there is a conflicted merge where one side is a directory + - or file, and the other side is a symlink, git merge always + - updates the work tree to contain the non-symlink. So, the + - directory or file will already be in the work tree correctly, + - and they just need to be staged into place. Do so by copying the + - index. (Note that this is also better than calling git-add + - because on a crippled filesystem, it preserves any symlink + - bits.) + - + - It's also possible for the branch to have a symlink in it, + - which is not a git-annex symlink. In this special case, + - git merge does not update the work tree to contain the symlink + - from the branch, so we have to do so manually. + -} + graftin b item select select' = do + Annex.Queue.addUpdateIndex + =<< fromRepo (UpdateIndex.lsSubTree b item) + when (select (LsFiles.unmergedBlobType u) == Just SymlinkBlob) $ + case select' (LsFiles.unmergedSha u) of + Nothing -> noop + Just sha -> do + link <- catLink True sha + replacewithlink item link + + 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 or just f, 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 f s || S.member (base f) s + base f = reverse $ drop 1 $ dropWhile (/= '~') $ reverse f + +commitResolvedMerge :: Git.Branch.CommitMode -> Annex Bool +commitResolvedMerge commitmode = inRepo $ Git.Branch.commitCommand commitmode + [ Param "--no-verify" + , Param "-m" + , Param "git-annex automatic merge conflict fix" + ] diff --git a/Annex/Branch.hs b/Annex/Branch.hs new file mode 100644 index 0000000000..a03d6ddf39 --- /dev/null +++ b/Annex/Branch.hs @@ -0,0 +1,539 @@ +{- 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 as L +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Bits.Utils + +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 Git.Branch.AutomaticCommit "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 $ decodeBS <$> 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 journalled + - 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 Git.Branch.AutomaticCommit 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 . decodeBS) . L.split newline + newline = c2w8 '\n' + 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 + (jlogf, jlogh) <- openjlog + withJournalHandle $ \jh -> do + h <- hashObjectStart g + Git.UpdateIndex.streamUpdateIndex g + [genstream dir h jh jlogh] + hashObjectStop h + return $ cleanup dir jlogh jlogf + where + genstream dir h jh jlogh streamer = do + v <- readDirectory jh + case v of + Nothing -> return () + Just file -> do + unless (dirCruft file) $ do + let path = dir file + sha <- hashFile h path + hPutStrLn jlogh file + streamer $ Git.UpdateIndex.updateIndexLine + sha FileBlob (asTopFilePath $ fileJournal file) + genstream dir h jh jlogh streamer + -- Clean up the staged files, as listed in the temp log file. + -- The temp file is used to avoid needing to buffer all the + -- filenames in memory. + cleanup dir jlogh jlogf = do + hFlush jlogh + hSeek jlogh AbsoluteSeek 0 + stagedfs <- lines <$> hGetContents jlogh + mapM_ (removeFile . (dir )) stagedfs + hClose jlogh + nukeFile jlogf + openjlog = do + tmpdir <- fromRepo gitAnnexTmpMiscDir + createAnnexDirectory tmpdir + liftIO $ openTempFile tmpdir "jlog" + +{- 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" . decodeBS + <$> 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 Git.Branch.AutomaticCommit 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 0000000000..5c2c145484 --- /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 0000000000..9b2f9a04c5 --- /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 0000000000..2f8c430794 --- /dev/null +++ b/Annex/CatFile.hs @@ -0,0 +1,149 @@ +{- 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, + catLink, +) 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 -> Sha -> FileMode -> Annex (Maybe Key) +catKey' modeguaranteed sha mode + | isSymLink mode = do + l <- catLink modeguaranteed sha + return $ if isLinkToAnnex l + then fileKey $ takeFileName l + else Nothing + | otherwise = return Nothing + +{- Gets a symlink target. -} +catLink :: Bool -> Sha -> Annex String +catLink modeguaranteed sha = fromInternalGitPath . decodeBS <$> get + 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 sha + | otherwise = L.take 8192 <$> catObject sha + +{- 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 0000000000..8eed9e804c --- /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 0000000000..d45e652bcb --- /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 0000000000..8ad3d5e65e --- /dev/null +++ b/Annex/Content.hs @@ -0,0 +1,633 @@ +{- 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 f = liftIO $ ifM (doesFileExist f) + ( do + v <- lockShared f + case v of + Nothing -> return is_locked + Just lockhandle -> do + dropLock lockhandle + return is_unlocked + , 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 False $ + 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 -> a -> Annex a -> Annex a +prepGetViaTmpChecked key unabletoget 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 unabletoget + ) + +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 0000000000..b249e05572 --- /dev/null +++ b/Annex/Content/Direct.hs @@ -0,0 +1,263 @@ +{- git-annex file content managing for direct mode + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +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, + withTSDelta, + getTSDelta, +) 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) + =<< withTSDelta (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 =<< withTSDelta (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 + curr <- withTSDelta $ \delta -> liftIO $ toInodeCache delta 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 = sentinalInodesChanged <$> sentinalStatus + +withTSDelta :: (TSDelta -> Annex a) -> Annex a +withTSDelta a = a =<< getTSDelta + +getTSDelta :: Annex TSDelta +#ifdef mingw32_HOST_OS +getTSDelta = sentinalTSDelta <$> sentinalStatus +#else +getTSDelta = pure noTSDelta -- optimisation +#endif + +sentinalStatus :: Annex SentinalStatus +sentinalStatus = maybe check return =<< Annex.getState Annex.sentinalstatus + where + check = do + sc <- liftIO . checkSentinalFile =<< annexSentinalFile + Annex.changeState $ \s -> s { Annex.sentinalstatus = Just sc } + return sc + +{- 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) $ do + s <- annexSentinalFile + createAnnexDirectory (parentDir (sentinalFile s)) + liftIO $ writeSentinalFile s + where + alreadyexists = liftIO. sentinalFileExists =<< annexSentinalFile + hasobjects = liftIO . doesDirectoryExist =<< fromRepo gitAnnexObjectDir + +annexSentinalFile :: Annex SentinalFile +annexSentinalFile = do + sentinalfile <- fromRepo gitAnnexInodeSentinal + sentinalcachefile <- fromRepo gitAnnexInodeSentinalCache + return $ SentinalFile + { sentinalFile = sentinalfile + , sentinalCacheFile = sentinalcachefile + } diff --git a/Annex/Direct.hs b/Annex/Direct.hs new file mode 100644 index 0000000000..e6b941e0f9 --- /dev/null +++ b/Annex/Direct.hs @@ -0,0 +1,450 @@ +{- git-annex direct mode + - + - Copyright 2012-2014 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 +import Git.Index +import Annex.Index +import Annex.LockFile + +{- 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) = withTSDelta $ \delta -> do + shakey <- catKey sha mode + mstat <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file + mcache <- liftIO $ maybe (pure Nothing) (toInodeCache delta) mstat + filekey <- isAnnexLink file + case (shakey, filekey, mstat, mcache) 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. + - + - So, to handle a merge, it's run with the work tree set to a temp + - directory, and the merge is staged into a copy of the index. + - Then the work tree is updated to reflect the merge, and + - finally, the merge is committed and the real index updated. + - + - A lock file is used to avoid races with any other caller of mergeDirect. + - + - To avoid other git processes from making change to the index while our + - merge is in progress, the index lock file is used as the temp index + - file. This is the same as what git does when updating the index + - normally. + -} +mergeDirect :: Maybe Git.Ref -> Maybe Git.Ref -> Git.Branch -> Annex Bool -> Git.Branch.CommitMode -> Annex Bool +mergeDirect startbranch oldref branch resolvemerge commitmode = exclusively $ do + reali <- fromRepo indexFile + tmpi <- fromRepo indexFileLock + liftIO $ copyFile reali tmpi + + d <- fromRepo gitAnnexMergeDir + liftIO $ do + whenM (doesDirectoryExist d) $ + removeDirectoryRecursive d + createDirectoryIfMissing True d + + withIndexFile tmpi $ do + merged <- stageMerge d branch commitmode + r <- if merged + then return True + else resolvemerge + mergeDirectCleanup d (fromMaybe Git.Sha.emptyTree oldref) + mergeDirectCommit merged startbranch branch commitmode + + liftIO $ rename tmpi reali + + return r + where + exclusively = withExclusiveLock gitAnnexMergeLock + +{- Stage a merge into the index, avoiding changing HEAD or the current + - branch. -} +stageMerge :: FilePath -> Git.Branch -> Git.Branch.CommitMode -> Annex Bool +stageMerge d branch commitmode = do + -- XXX A bug in git makes stageMerge unsafe to use if the git repo + -- is configured with core.symlinks=false + -- Using mergeNonInteractive is not ideal though, since it will + -- update the current branch immediately, before the work tree + -- has been updated, which would leave things in an inconsistent + -- state if mergeDirectCleanup is interrupted. + -- + merger <- ifM (coreSymlinks <$> Annex.getGitConfig) + ( return Git.Merge.stageMerge + , return $ \ref -> Git.Merge.mergeNonInteractive ref commitmode + ) + inRepo $ \g -> merger branch $ + g { location = Local { gitdir = Git.localGitDir g, worktree = Just d } } + +{- Commits after a direct mode merge is complete, and after the work + - tree has been updated by mergeDirectCleanup. + -} +mergeDirectCommit :: Bool -> Maybe Git.Ref -> Git.Branch -> Git.Branch.CommitMode -> Annex () +mergeDirectCommit allowff old branch commitmode = do + void preCommitDirect + d <- fromRepo Git.localGitDir + let merge_head = d "MERGE_HEAD" + let merge_msg = d "MERGE_MSG" + let merge_mode = d "MERGE_MODE" + ifM (pure allowff <&&> canff) + ( inRepo $ Git.Branch.update Git.Ref.headRef branch -- fast forward + , do + msg <- liftIO $ + catchDefaultIO ("merge " ++ fromRef branch) $ + readFile merge_msg + void $ inRepo $ Git.Branch.commit commitmode False msg + Git.Ref.headRef [Git.Ref.headRef, branch] + ) + liftIO $ mapM_ nukeFile [merge_head, merge_msg, merge_mode] + where + canff = maybe (return False) (\o -> inRepo $ Git.Branch.fastForwardable o branch) old + +{- Cleans up after a direct mode merge. The merge must have been staged + - in the index. Uses diff-index to compare the staged changes with + - the tree before the merge, 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 -> Annex () +mergeDirectCleanup d oldref = do + (items, cleanup) <- inRepo $ DiffTree.diffIndex oldref + 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 + - oldref, 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 oldref + 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 oldref + 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 oldref, 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 oldref = 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 oldref 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 + replaceFileOr f + (liftIO . moveFile loc) + $ \tmp -> do -- rollback + liftIO (moveFile tmp loc) + freezeContent 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 0000000000..13485242ae --- /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 0000000000..71263dc618 --- /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 0000000000..4b8d384642 --- /dev/null +++ b/Annex/Environment.hs @@ -0,0 +1,67 @@ +{- 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 and user.name to a dummy value and tries the action again. -} +ensureCommit :: Annex a -> Annex a +ensureCommit a = either retry return =<< tryAnnex a + where + retry _ = do + name <- liftIO myUserName + setConfig (ConfigKey "user.name") name + setConfig (ConfigKey "user.email") name + a diff --git a/Annex/Exception.hs b/Annex/Exception.hs new file mode 100644 index 0000000000..41a9ed9216 --- /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 Control.Monad.Catch 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.throwM + +{- 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 0000000000..da6a5e0e93 --- /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 0000000000..4848e2d61f --- /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 0000000000..af0cab45e4 --- /dev/null +++ b/Annex/Index.hs @@ -0,0 +1,53 @@ +{- Using other git index files + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Index ( + withIndexFile, + addGitEnv, +) 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 + g' <- liftIO $ addGitEnv g "GIT_INDEX_FILE" f + + 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 + +addGitEnv :: Repo -> String -> String -> IO Repo +addGitEnv g var val = do + e <- maybe copyenv return (gitEnv g) + let e' = addEntry var val e + return $ g { gitEnv = Just e' } + where + copyenv = do +#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 + liftIO $ catMaybes <$> forM keyenv getEnvPair +#else + liftIO getEnvironment +#endif diff --git a/Annex/Init.hs b/Annex/Init.hs new file mode 100644 index 0000000000..637b130ee8 --- /dev/null +++ b/Annex/Init.hs @@ -0,0 +1,244 @@ +{- 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, + initialize', + uninitialize, + probeCrippledFileSystem, +) where + +import Common.Annex +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 + initialize' + + 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 + +initialize' :: Annex () +initialize' = do + 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 + +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 0000000000..f34a7be1bf --- /dev/null +++ b/Annex/Journal.hs @@ -0,0 +1,121 @@ +{- 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 Common.Annex +import Annex.Exception +import qualified Git +import Annex.Perms +import Annex.LockFile + +{- 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 + withFile tmpfile WriteMode $ \h -> do + fileEncoding h +#ifdef mingw32_HOST_OS + hSetNewlineMode h noNewlineTranslation +#endif + hPutStr h 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 $ + readFileStrictAnyEncoding $ 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 + +withJournalHandle :: (DirectoryHandle -> IO a) -> Annex a +withJournalHandle a = do + d <- fromRepo gitAnnexJournalDir + bracketIO (openDirectory d) closeDirectory (liftIO . a) + +{- Checks if there are changes in the journal. -} +journalDirty :: Annex Bool +journalDirty = do + d <- fromRepo gitAnnexJournalDir + liftIO $ + (not <$> isDirectoryEmpty d) + `catchIO` (const $ doesDirectoryExist d) + +{- 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 = withExclusiveLock gitAnnexJournalLock $ a ProduceJournalLocked diff --git a/Annex/Link.hs b/Annex/Link.hs new file mode 100644 index 0000000000..25166bff5c --- /dev/null +++ b/Annex/Link.hs @@ -0,0 +1,108 @@ +{- 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 + +makeAnnexLink :: LinkTarget -> FilePath -> Annex () +makeAnnexLink = makeGitLink + +{- 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. + -} +makeGitLink :: LinkTarget -> FilePath -> Annex () +makeGitLink 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/LockFile.hs b/Annex/LockFile.hs new file mode 100644 index 0000000000..8114e94f2b --- /dev/null +++ b/Annex/LockFile.hs @@ -0,0 +1,87 @@ +{- git-annex lock files. + - + - Copyright 2012, 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.LockFile ( + lockFileShared, + unlockFile, + getLockPool, + withExclusiveLock, +) where + +import Common.Annex +import Annex +import Types.LockPool +import qualified Git +import Annex.Exception +import Annex.Perms + +import qualified Data.Map as M + +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +{- Create a specified lock file, and takes a shared lock, which is retained + - in the pool. -} +lockFileShared :: FilePath -> Annex () +lockFileShared file = go =<< fromLockPool 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 + changeLockPool $ M.insert file lockhandle + +unlockFile :: FilePath -> Annex () +unlockFile file = maybe noop go =<< fromLockPool file + where + go lockhandle = do +#ifndef mingw32_HOST_OS + liftIO $ closeFd lockhandle +#else + liftIO $ dropLock lockhandle +#endif + changeLockPool $ M.delete file + +getLockPool :: Annex LockPool +getLockPool = getState lockpool + +fromLockPool :: FilePath -> Annex (Maybe LockHandle) +fromLockPool file = M.lookup file <$> getLockPool + +changeLockPool :: (LockPool -> LockPool) -> Annex () +changeLockPool a = do + m <- getLockPool + changeState $ \s -> s { lockpool = a m } + +{- Runs an action with an exclusive lock held. If the lock is already + - held, blocks until it becomes free. -} +withExclusiveLock :: (Git.Repo -> FilePath) -> Annex a -> Annex a +withExclusiveLock getlockfile a = do + lockfile <- fromRepo getlockfile + createAnnexDirectory $ takeDirectory lockfile + mode <- annexFileMode + bracketIO (lock lockfile mode) unlock (const a) + 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/MakeRepo.hs b/Annex/MakeRepo.hs new file mode 100644 index 0000000000..a1f797a76b --- /dev/null +++ b/Annex/MakeRepo.hs @@ -0,0 +1,88 @@ +{- making local repositories (used by webapp mostly) + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.MakeRepo where + +import Assistant.WebApp.Common +import Annex.Init +import qualified Git.Construct +import qualified Git.Config +import qualified Git.Command +import qualified Git.Branch +import qualified Annex +import Annex.UUID +import Annex.Direct +import Types.StandardGroups +import Logs.PreferredContent +import qualified Annex.Branch + +{- Makes a new git repository. Or, if a git repository already + - exists, returns False. -} +makeRepo :: FilePath -> Bool -> IO Bool +makeRepo path bare = ifM (probeRepoExists path) + ( return False + , do + (transcript, ok) <- + processTranscript "git" (toCommand params) Nothing + unless ok $ + error $ "git init failed!\nOutput:\n" ++ transcript + return True + ) + where + baseparams = [Param "init", Param "--quiet"] + params + | bare = baseparams ++ [Param "--bare", File path] + | otherwise = baseparams ++ [File path] + +{- Runs an action in the git repository in the specified directory. -} +inDir :: FilePath -> Annex a -> IO a +inDir dir a = do + state <- Annex.new =<< Git.Config.read =<< Git.Construct.fromPath dir + Annex.eval state a + +{- Creates a new repository, and returns its UUID. -} +initRepo :: Bool -> Bool -> FilePath -> Maybe String -> Maybe StandardGroup -> IO UUID +initRepo True primary_assistant_repo dir desc mgroup = inDir dir $ do + initRepo' desc mgroup + {- Initialize the master branch, so things that expect + - to have it will work, before any files are added. -} + unlessM (Git.Config.isBare <$> gitRepo) $ + void $ inRepo $ Git.Branch.commitCommand Git.Branch.AutomaticCommit + [ Param "--quiet" + , Param "--allow-empty" + , Param "-m" + , Param "created repository" + ] + {- Repositories directly managed by the assistant use direct mode. + - + - Automatic gc is disabled, as it can be slow. Insted, gc is done + - once a day. + -} + when primary_assistant_repo $ do + setDirect True + inRepo $ Git.Command.run + [Param "config", Param "gc.auto", Param "0"] + getUUID +{- Repo already exists, could be a non-git-annex repo though so + - still initialize it. -} +initRepo False _ dir desc mgroup = inDir dir $ do + initRepo' desc mgroup + getUUID + +initRepo' :: Maybe String -> Maybe StandardGroup -> Annex () +initRepo' desc mgroup = unlessM isInitialized $ do + initialize desc + u <- getUUID + maybe noop (defaultStandardGroup u) mgroup + {- Ensure branch gets committed right away so it is + - available for merging immediately. -} + Annex.Branch.commit "update" + +{- Checks if a git repo exists at a location. -} +probeRepoExists :: FilePath -> IO Bool +probeRepoExists dir = isJust <$> + catchDefaultIO Nothing (Git.Construct.checkForRepo dir) diff --git a/Annex/MetaData.hs b/Annex/MetaData.hs new file mode 100644 index 0000000000..22e9e7e50a --- /dev/null +++ b/Annex/MetaData.hs @@ -0,0 +1,55 @@ +{- git-annex metadata + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.MetaData ( + genMetaData, + dateMetaData, + 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 + curr <- getCurrentMetaData key + addMetaData key (dateMetaData mtime curr) + where + mtime = posixSecondsToUTCTime $ realToFrac $ modificationTime status + +{- Generates metadata for a file's date stamp. + - Does not overwrite any existing metadata values. -} +dateMetaData :: UTCTime -> MetaData -> MetaData +dateMetaData mtime 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 $ mtime diff --git a/Annex/MetaData/StandardFields.hs b/Annex/MetaData/StandardFields.hs new file mode 100644 index 0000000000..d41fb1506f --- /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 0000000000..608bda7e21 --- /dev/null +++ b/Annex/Notification.hs @@ -0,0 +1,101 @@ +{- git-annex desktop notifications + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Notification (NotifyWitness, notifyTransfer, notifyDrop) 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 + if (notifyStart wanted || notifyFinish wanted) + then do + client <- liftIO DBus.Client.connectSession + startnotification <- liftIO $ if notifyStart wanted + then Just <$> Notify.notify client (startedTransferNote direction f) + else pure Nothing + ok <- a NotifyWitness + when (notifyFinish wanted) $ liftIO $ void $ maybe + (Notify.notify client $ finishedTransferNote ok direction f) + (\n -> Notify.replace client n $ finishedTransferNote ok direction f) + 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 + void $ Notify.notify client (droppedNote ok f) +#else +notifyDrop (Just _) _ = noop +#endif + +#ifdef WITH_DBUS_NOTIFICATIONS +startedTransferNote :: Direction -> FilePath -> Notify.Note +startedTransferNote Upload = mkNote Notify.Transfer Notify.Low iconUpload + "Uploading" +startedTransferNote Download = mkNote Notify.Transfer Notify.Low iconDownload + "Downloading" + +finishedTransferNote :: Bool -> Direction -> FilePath -> Notify.Note +finishedTransferNote False Upload = mkNote Notify.TransferError Notify.Normal iconFailure + "Failed to upload" +finishedTransferNote False Download = mkNote Notify.TransferError Notify.Normal iconFailure + "Failed to download" +finishedTransferNote True Upload = mkNote Notify.TransferComplete Notify.Low iconSuccess + "Finished uploading" +finishedTransferNote True Download = mkNote Notify.TransferComplete Notify.Low iconSuccess + "Finished downloading" + +droppedNote :: Bool -> FilePath -> Notify.Note +droppedNote False = mkNote Notify.TransferError Notify.Normal iconFailure + "Failed to drop" +droppedNote True = mkNote Notify.TransferComplete Notify.Low iconSuccess + "Dropped" + +iconUpload, iconDownload, iconFailure, iconSuccess :: String +iconUpload = "network-transmit" +iconDownload = "network-receive" +iconFailure = "dialog-error" +iconSuccess = "git-annex" -- Is there a standard icon for success/completion? + +mkNote :: Notify.Category -> Notify.UrgencyLevel -> String -> String -> FilePath -> Notify.Note +mkNote category urgency icon desc path = Notify.blankNote + { Notify.appName = "git-annex" + , Notify.appImage = Just (Notify.Icon icon) + , Notify.summary = desc ++ " " ++ path + , Notify.hints = + [ Notify.Category category + , Notify.Urgency urgency + , Notify.SuppressSound True + ] + } +#endif diff --git a/Annex/Path.hs b/Annex/Path.hs new file mode 100644 index 0000000000..a8c4907b23 --- /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 0000000000..e3a2fa65a2 --- /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 0000000000..a5ef600379 --- /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 0000000000..1a2edf6b8a --- /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 0000000000..e734c4d64b --- /dev/null +++ b/Annex/ReplaceFile.hs @@ -0,0 +1,44 @@ +{- 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 action = replaceFileOr file action (liftIO . nukeFile) + +{- If unable to replace the file with the temp file, runs the + - rollback action, which is responsible for cleaning up the temp file. -} +replaceFileOr :: FilePath -> (FilePath -> Annex ()) -> (FilePath -> Annex ()) -> Annex () +replaceFileOr file action rollback = do + tmpdir <- fromRepo gitAnnexTmpMiscDir + void $ createAnnexDirectory tmpdir + bracketAnnex (liftIO $ setup tmpdir) rollback $ \tmpfile -> do + action 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 0000000000..246ac338d7 --- /dev/null +++ b/Annex/Ssh.hs @@ -0,0 +1,285 @@ +{- git-annex ssh interface, with connection caching + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Ssh ( + sshCachingOptions, + sshCacheDir, + sshReadPort, + forceSshCleanup, + sshCachingEnv, + sshCachingTo, + inRepoWithSshCachingTo, + runSshCaching, + sshAskPassEnv, + runSshAskPass +) where + +import qualified Data.Map as M +import Data.Hash.MD5 +import System.Exit + +import Common.Annex +import Annex.LockFile +import qualified Build.SysConfig as SysConfig +import qualified Annex +import qualified Git +import qualified Git.Url +import Config +import Config.Files +import Utility.Env +import Types.CleanupActions +import Annex.Index (addGitEnv) +#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 = go =<< sshInfo (host, port) + where + go (Nothing, params) = ret params + go (Just socketfile, params) = do + prepSocket socketfile + ret params + ret ps = return $ ps ++ opts ++ portParams port ++ [Param "-T"] + +{- 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 + let socktmp = tmpdir "ssh" + createDirectoryIfMissing True socktmp + return socktmp + +portParams :: Maybe Integer -> [CommandParam] +portParams Nothing = [] +portParams (Just port) = [Param "-p", Param $ show port] + +{- Prepare to use a socket file. Locks a lock file to prevent + - other git-annex processes from stopping the ssh on this socket. -} +prepSocket :: FilePath -> Annex () +prepSocket socketfile = do + -- 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. + whenM (not . any isLock . M.keys <$> getLockPool) + sshCleanup + -- Cleanup at end of this run. + Annex.addCleanup SshCachingCleanup sshCleanup + + liftIO $ createDirectoryIfMissing True $ parentDir socketfile + lockFileShared $ socket2lock socketfile + +enumSocketFiles :: Annex [FilePath] +enumSocketFiles = go =<< sshCacheDir + where + go Nothing = return [] + go (Just dir) = liftIO $ filter (not . isLock) + <$> catchDefaultIO [] (dirContents dir) + +{- Stop any unused ssh connection caching processes. -} +sshCleanup :: Annex () +sshCleanup = mapM_ cleanup =<< enumSocketFiles + where + 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. + -- + -- After ssh is stopped cannot remove the lock file; + -- other processes may be waiting on our exclusive + -- lock to use it. + 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 _ -> forceStopSsh socketfile + liftIO $ closeFd fd +#else + forceStopSsh socketfile +#endif + +{- Stop all ssh connection caching processes, even when they're in use. -} +forceSshCleanup :: Annex () +forceSshCleanup = mapM_ forceStopSsh =<< enumSocketFiles + +forceStopSsh :: FilePath -> Annex () +forceStopSsh 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 + +{- 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 + +{- When this env var is set, git-annex runs ssh with parameters + - to use the socket file that the env var contains. + - + - This is a workaround for GIT_SSH not being able to contain + - additional parameters to pass to ssh. -} +sshCachingEnv :: String +sshCachingEnv = "GIT_ANNEX_SSHCACHING" + +{- Enables ssh caching for git push/pull to a particular + - remote git repo. (Can safely be used on non-ssh remotes.) + - + - Like inRepo, the action is run with the local git repo. + - But here it's a modified version, with gitEnv to set GIT_SSH=git-annex, + - and sshCachingEnv set so that git-annex will know what socket + - file to use. -} +inRepoWithSshCachingTo :: Git.Repo -> (Git.Repo -> IO a) -> Annex a +inRepoWithSshCachingTo remote a = + liftIO . a =<< sshCachingTo remote =<< gitRepo + +{- To make any git commands be run with ssh caching enabled, + - alters the local Git.Repo's gitEnv to set GIT_SSH=git-annex, + - and set sshCachingEnv so that git-annex will know what socket + - file to use. -} +sshCachingTo :: Git.Repo -> Git.Repo -> Annex Git.Repo +sshCachingTo remote g + | not (Git.repoIsUrl remote) || Git.repoIsHttp remote = uncached + | otherwise = case Git.Url.hostuser remote of + Nothing -> uncached + Just host -> do + (msockfile, _) <- sshInfo (host, Git.Url.port remote) + case msockfile of + Nothing -> return g + Just sockfile -> do + command <- liftIO readProgramFile + prepSocket sockfile + liftIO $ do + g' <- addGitEnv g sshCachingEnv sockfile + addGitEnv g' "GIT_SSH" command + where + uncached = return g + +runSshCaching :: [String] -> FilePath -> IO () +runSshCaching args sockfile = do + let args' = toCommand (sshConnectionCachingParams sockfile) ++ args + let p = proc "ssh" args' + exitWith =<< waitForProcess . processHandle =<< createProcess p + +{- When this env var is set, git-annex is being used as a ssh-askpass + - program, and should read the password from the specified location, + - and output it for ssh to read. -} +sshAskPassEnv :: String +sshAskPassEnv = "GIT_ANNEX_SSHASKPASS" + +runSshAskPass :: FilePath -> IO () +runSshAskPass passfile = putStrLn =<< readFile passfile diff --git a/Annex/TaggedPush.hs b/Annex/TaggedPush.hs new file mode 100644 index 0000000000..35fdf333c4 --- /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 0000000000..df5aba09cf --- /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 0000000000..5ed8876891 --- /dev/null +++ b/Annex/UUID.hs @@ -0,0 +1,100 @@ +{- 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, + storeUUIDIn, + 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) $ storeUUIDIn 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 =<< liftIO genUUID + +storeUUID :: UUID -> Annex () +storeUUID = storeUUIDIn configkey + +storeUUIDIn :: ConfigKey -> UUID -> Annex () +storeUUIDIn 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 0000000000..397a7910be --- /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 0000000000..7c849c59f0 --- /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 0000000000..2a75a1c550 --- /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 0000000000..b969816128 --- /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 Git.Branch.AutomaticCommit 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 0000000000..25ac16a346 --- /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 0000000000..42f813bbbc --- /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 0000000000..82f1572414 --- /dev/null +++ b/Assistant.hs @@ -0,0 +1,196 @@ +{- 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.RemoteControl +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 +import Annex.Perms +import Utility.LogFile +#ifdef mingw32_HOST_OS +import Utility.Env +import Config.Files +import System.Environment (getArgs) +#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 + logfile <- fromRepo gitAnnexLogFile + liftIO $ debugM desc $ "logging to " ++ logfile +#ifndef mingw32_HOST_OS + createAnnexDirectory (parentDir logfile) + logfd <- liftIO $ handleToFd =<< openLog logfile + if foreground + then do + origout <- liftIO $ catchMaybeIO $ + fdToHandle =<< dup stdOutput + origerr <- liftIO $ catchMaybeIO $ + fdToHandle =<< dup stdError + let undaemonize = Utility.Daemon.foreground logfd (Just pidfile) + 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 doesn't daemonize, but does redirect output to the + -- log file. The only way to do so is to restart the program. + when (foreground || not foreground) $ do + let flag = "GIT_ANNEX_OUTPUT_REDIR" + createAnnexDirectory (parentDir logfile) + ifM (liftIO $ isNothing <$> getEnv flag) + ( liftIO $ withFile devNull WriteMode $ \nullh -> do + loghandle <- openLog logfile + e <- getEnvironment + cmd <- readProgramFile + ps <- getArgs + (_, _, _, pid) <- createProcess (proc cmd ps) + { env = Just (addEntry flag "1" e) + , std_in = UseHandle nullh + , std_out = UseHandle loghandle + , std_err = UseHandle loghandle + } + exitWith =<< waitForProcess pid + , start (Utility.Daemon.foreground (Just pidfile)) $ + 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 $ remoteControlThread + , 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 0000000000..745694f59a --- /dev/null +++ b/Assistant/Alert.hs @@ -0,0 +1,461 @@ +{- 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 Git.Types (RemoteName) + +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 :: [RemoteName] -> TenseChunk +showRemotes = UnTensed . T.intercalate ", " . map T.pack + +syncAlert :: [Remote] -> Alert +syncAlert = syncAlert' . map Remote.name + +syncAlert' :: [RemoteName] -> 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 = syncResultAlert' + (map Remote.name succeeded) + (map Remote.name failed) + +syncResultAlert' :: [RemoteName] -> [RemoteName] -> 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 + } + +connectionNeededAlert :: AlertButton -> Alert +connectionNeededAlert button = Alert + { alertHeader = Just "Share with friends, and keep your devices in sync across the cloud." + , alertIcon = Just ConnectionIcon + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just ConnectionNeededAlert + , 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 0000000000..be631e9991 --- /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 0000000000..c9354544a5 --- /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 0000000000..2ecd2036ce --- /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 0000000000..7d1d3780fe --- /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 0000000000..f9719422d9 --- /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/CredPairCache.hs b/Assistant/CredPairCache.hs new file mode 100644 index 0000000000..2b8f72e7cd --- /dev/null +++ b/Assistant/CredPairCache.hs @@ -0,0 +1,53 @@ +{- git-annex assistant CredPair cache. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.CredPairCache ( + cacheCred, + getCachedCred, + expireCachedCred, +) where + +import Assistant.Types.CredPairCache +import Types.Creds +import Assistant.Common +import Utility.ThreadScheduler + +import qualified Data.Map as M +import Control.Concurrent + +{- Caches a CredPair, but only for a limited time, after which it + - will expire. + - + - Note that repeatedly caching the same CredPair + - does not reset its expiry time. + -} +cacheCred :: CredPair -> Seconds -> Assistant () +cacheCred (login, password) expireafter = do + cache <- getAssistant credPairCache + liftIO $ do + changeStrict cache $ M.insert login password + void $ forkIO $ do + threadDelaySeconds expireafter + changeStrict cache $ M.delete login + +getCachedCred :: Login -> Assistant (Maybe Password) +getCachedCred login = do + cache <- getAssistant credPairCache + liftIO $ M.lookup login <$> readMVar cache + +expireCachedCred :: Login -> Assistant () +expireCachedCred login = do + cache <- getAssistant credPairCache + liftIO $ changeStrict cache $ M.delete login + +{- Update map strictly to avoid keeping references to old creds in memory. -} +changeStrict :: CredPairCache -> (M.Map Login Password -> M.Map Login Password) -> IO () +changeStrict cache a = modifyMVar_ cache $ \m -> do + let !m' = a m + return m' diff --git a/Assistant/DaemonStatus.hs b/Assistant/DaemonStatus.hs new file mode 100644 index 0000000000..35f8fc8564 --- /dev/null +++ b/Assistant/DaemonStatus.hs @@ -0,0 +1,271 @@ +{- 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.Set as S +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 + +changeCurrentlyConnected :: (S.Set UUID -> S.Set UUID) -> Assistant () +changeCurrentlyConnected sm = do + modifyDaemonStatus_ $ \ds -> ds + { currentlyConnectedRemotes = sm (currentlyConnectedRemotes ds) + } + v <- currentlyConnectedRemotes <$> getDaemonStatus + debug [show v] + liftIO . sendNotification =<< syncRemotesNotifier <$> getDaemonStatus + +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 0000000000..cc05786e40 --- /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 0000000000..efd74fdb3e --- /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/Fsck.hs b/Assistant/Fsck.hs new file mode 100644 index 0000000000..791c0cf170 --- /dev/null +++ b/Assistant/Fsck.hs @@ -0,0 +1,50 @@ +{- git-annex assistant fscking + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +module Assistant.Fsck where + +import Assistant.Common +import Types.ScheduledActivity +import qualified Types.Remote as Remote +import Annex.UUID +import Assistant.Alert +import Assistant.Types.UrlRenderer +import Logs.Schedule +import qualified Annex + +import qualified Data.Set as S + +{- Displays a nudge in the webapp if a fsck is not configured for + - the specified remote, or for the local repository. -} +fsckNudge :: UrlRenderer -> Maybe Remote -> Assistant () +fsckNudge urlrenderer mr + | maybe True fsckableRemote mr = + whenM (liftAnnex $ annexFsckNudge <$> Annex.getGitConfig) $ + unlessM (liftAnnex $ checkFscked mr) $ + notFsckedNudge urlrenderer mr + | otherwise = noop + +fsckableRemote :: Remote -> Bool +fsckableRemote = isJust . Remote.remoteFsck + +{- Checks if the remote, or the local repository, has a fsck scheduled. + - Only looks at fscks configured to run via the local repository, not + - other repositories. -} +checkFscked :: Maybe Remote -> Annex Bool +checkFscked mr = any wanted . S.toList <$> (scheduleGet =<< getUUID) + where + wanted = case mr of + Nothing -> isSelfFsck + Just r -> flip isFsckOf (Remote.uuid r) + +isSelfFsck :: ScheduledActivity -> Bool +isSelfFsck (ScheduledSelfFsck _ _) = True +isSelfFsck _ = False + +isFsckOf :: ScheduledActivity -> UUID -> Bool +isFsckOf (ScheduledRemoteFsck u _ _) u' = u == u' +isFsckOf _ _ = False diff --git a/Assistant/Gpg.hs b/Assistant/Gpg.hs new file mode 100644 index 0000000000..a55a0cab73 --- /dev/null +++ b/Assistant/Gpg.hs @@ -0,0 +1,36 @@ +{- git-annex assistant gpg stuff + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-} + +module Assistant.Gpg where + +import Utility.Gpg +import Utility.UserInfo +import Types.Remote (RemoteConfigKey) + +import qualified Data.Map as M + +{- Generates a gpg user id that is not used by any existing secret key -} +newUserId :: IO UserId +newUserId = do + oldkeys <- secretKeys + username <- myUserName + let basekeyname = username ++ "'s git-annex encryption key" + return $ Prelude.head $ filter (\n -> M.null $ M.filter (== n) oldkeys) + ( basekeyname + : map (\n -> basekeyname ++ show n) ([2..] :: [Int]) + ) + +data EnableEncryption = HybridEncryption | SharedEncryption | NoEncryption + deriving (Eq) + +{- Generates Remote configuration for encryption. -} +configureEncryption :: EnableEncryption -> (RemoteConfigKey, String) +configureEncryption SharedEncryption = ("encryption", "shared") +configureEncryption NoEncryption = ("encryption", "none") +configureEncryption HybridEncryption = ("encryption", "hybrid") diff --git a/Assistant/Install.hs b/Assistant/Install.hs new file mode 100644 index 0000000000..84dc779d4c --- /dev/null +++ b/Assistant/Install.hs @@ -0,0 +1,137 @@ +{- 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 the + - git-annex-shell and git-annex-wrapper wrapper scripts 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 + + sshdir <- sshDir + let runshell var = "exec " ++ base "runshell " ++ var + let rungitannexshell var = runshell $ "git-annex-shell -c \"" ++ var ++ "\"" + + installWrapper (sshdir "git-annex-shell") $ unlines + [ shebang_local + , "set -e" + , "if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then" + , rungitannexshell "$SSH_ORIGINAL_COMMAND" + , "else" + , rungitannexshell "$@" + , "fi" + ] + installWrapper (sshdir "git-annex-wrapper") $ unlines + [ shebang_local + , "set -e" + , runshell "\"$@\"" + ] + + installNautilus program + +installWrapper :: FilePath -> String -> IO () +installWrapper file content = do + curr <- catchDefaultIO "" $ readFileStrict file + when (curr /= content) $ do + createDirectoryIfMissing True (parentDir file) + viaTmp writeFile file content + modifyFileMode file $ addModes [ownerExecuteMode] + +installNautilus :: FilePath -> IO () +#ifdef linux_HOST_OS +installNautilus program = do + scriptdir <- (\d -> d "nautilus" "scripts") <$> userDataDir + createDirectoryIfMissing True scriptdir + 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 environ + | null vars = Nothing + | otherwise = Just $ catMaybes $ map (restoreorig environ) environ + | otherwise = Nothing + where + vars = words $ fromMaybe "" $ + lookup "GIT_ANNEX_STANDLONE_ENV" environ + restoreorig oldenviron p@(k, _v) + | k `elem` vars = case lookup ("ORIG_" ++ k) oldenviron 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 0000000000..b03d202244 --- /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 0000000000..d095cdd887 --- /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 0000000000..967a4d41d2 --- /dev/null +++ b/Assistant/MakeRemote.hs @@ -0,0 +1,171 @@ +{- 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' False name remotetype config mcreds (Just u, c) + +setupSpecialRemote :: RemoteName -> RemoteType -> R.RemoteConfig -> Maybe CredPair -> (Maybe UUID, R.RemoteConfig) -> Annex RemoteName +setupSpecialRemote = setupSpecialRemote' True + +setupSpecialRemote' :: Bool -> RemoteName -> RemoteType -> R.RemoteConfig -> Maybe CredPair -> (Maybe UUID, R.RemoteConfig) -> Annex RemoteName +setupSpecialRemote' setdesc 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 + configSet u c' + when setdesc $ + whenM (isNothing . M.lookup u <$> uuidMap) $ + describeUUID u name + 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 0000000000..5b3f5abb4d --- /dev/null +++ b/Assistant/Monad.hs @@ -0,0 +1,150 @@ +{- 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 +import Assistant.Types.RemoteControl +import Assistant.Types.CredPairCache + +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 + , remoteControl :: RemoteControl + , credPairCache :: CredPairCache + } + +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 + <*> newRemoteControl + <*> newCredPairCache + +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 0000000000..e1b3983f76 --- /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 0000000000..acb18b6484 --- /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 0000000000..bb1384a151 --- /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 0000000000..3f38236647 --- /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 0000000000..6c625f8814 --- /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 0000000000..54f31a84bc --- /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/RemoteControl.hs b/Assistant/RemoteControl.hs new file mode 100644 index 0000000000..86d13cc567 --- /dev/null +++ b/Assistant/RemoteControl.hs @@ -0,0 +1,21 @@ +{- git-annex assistant RemoteDaemon control + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.RemoteControl ( + sendRemoteControl, + RemoteDaemon.Consumed(..) +) where + +import Assistant.Common +import qualified RemoteDaemon.Types as RemoteDaemon + +import Control.Concurrent + +sendRemoteControl :: RemoteDaemon.Consumed -> Assistant () +sendRemoteControl msg = do + clicker <- getAssistant remoteControl + liftIO $ writeChan clicker msg diff --git a/Assistant/Repair.hs b/Assistant/Repair.hs new file mode 100644 index 0000000000..5e5a28dcec --- /dev/null +++ b/Assistant/Repair.hs @@ -0,0 +1,160 @@ +{- git-annex assistant repository repair + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Repair where + +import Assistant.Common +import Command.Repair (repairAnnexBranch, trackingOrSyncBranch) +import Git.Fsck (FsckResults, foundBroken) +import Git.Repair (runRepairOf) +import qualified Git +import qualified Remote +import qualified Types.Remote as Remote +import Logs.FsckResults +import Annex.UUID +import Utility.Batch +import Config.Files +import Assistant.Sync +import Assistant.Alert +import Assistant.DaemonStatus +import Assistant.Types.UrlRenderer +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import qualified Data.Text as T +#endif +import qualified Utility.Lsof as Lsof +import Utility.ThreadScheduler + +import Control.Concurrent.Async + +{- When the FsckResults require a repair, tries to do a non-destructive + - repair. If that fails, pops up an alert. -} +repairWhenNecessary :: UrlRenderer -> UUID -> Maybe Remote -> FsckResults -> Assistant Bool +repairWhenNecessary urlrenderer u mrmt fsckresults + | foundBroken fsckresults = do + liftAnnex $ writeFsckResults u fsckresults + repodesc <- liftAnnex $ Remote.prettyUUID u + ok <- alertWhile (repairingAlert repodesc) + (runRepair u mrmt False) +#ifdef WITH_WEBAPP + unless ok $ do + button <- mkAlertButton True (T.pack "Click Here") urlrenderer $ + RepairRepositoryR u + void $ addAlert $ brokenRepositoryAlert [button] +#endif + return ok + | otherwise = return False + +runRepair :: UUID -> Maybe Remote -> Bool -> Assistant Bool +runRepair u mrmt destructiverepair = do + fsckresults <- liftAnnex $ readFsckResults u + myu <- liftAnnex getUUID + ok <- if u == myu + then localrepair fsckresults + else remoterepair fsckresults + liftAnnex $ clearFsckResults u + debug [ "Repaired", show u, show ok ] + + return ok + where + localrepair fsckresults = do + -- Stop the watcher from running while running repairs. + changeSyncable Nothing False + + -- This intentionally runs the repair inside the Annex + -- monad, which is not strictly necessary, but keeps + -- other threads that might be trying to use the Annex + -- from running until it completes. + ok <- liftAnnex $ repair fsckresults Nothing + + -- Run a background fast fsck if a destructive repair had + -- to be done, to ensure that the git-annex branch + -- reflects the current state of the repo. + when destructiverepair $ + backgroundfsck [ Param "--fast" ] + + -- Start the watcher running again. This also triggers it to + -- do a startup scan, which is especially important if the + -- git repo repair removed files from the index file. Those + -- files will be seen as new, and re-added to the repository. + when (ok || destructiverepair) $ + changeSyncable Nothing True + + return ok + + remoterepair fsckresults = case Remote.repairRepo =<< mrmt of + Nothing -> return False + Just mkrepair -> do + thisrepopath <- liftIO . absPath + =<< liftAnnex (fromRepo Git.repoPath) + a <- liftAnnex $ mkrepair $ + repair fsckresults (Just thisrepopath) + liftIO $ catchBoolIO a + + repair fsckresults referencerepo = do + (ok, modifiedbranches) <- inRepo $ + runRepairOf fsckresults trackingOrSyncBranch destructiverepair referencerepo + when destructiverepair $ + repairAnnexBranch modifiedbranches + return ok + + backgroundfsck params = liftIO $ void $ async $ do + program <- readProgramFile + batchCommand program (Param "fsck" : params) + +{- Detect when a git lock file exists and has no git process currently + - writing to it. This strongly suggests it is a stale lock file. + - + - However, this could be on a network filesystem. Which is not very safe + - anyway (the assistant relies on being able to check when files have + - no writers to know when to commit them). Also, a few lock-file-ish + - things used by git are not kept open, particularly MERGE_HEAD. + - + - So, just in case, when the lock file appears stale, we delay for one + - minute, and check its size. If the size changed, delay for another + - minute, and so on. This will at work to detect when another machine + - is writing out a new index file, since git does so by writing the + - new content to index.lock. + - + - Returns true if locks were cleaned up. + -} +repairStaleGitLocks :: Git.Repo -> Assistant Bool +repairStaleGitLocks r = do + lockfiles <- liftIO $ filter islock <$> findgitfiles r + repairStaleLocks lockfiles + return $ not $ null lockfiles + where + findgitfiles = dirContentsRecursiveSkipping (== dropTrailingPathSeparator annexDir) True . Git.localGitDir + islock f + | "gc.pid" `isInfixOf` f = False + | ".lock" `isSuffixOf` f = True + | takeFileName f == "MERGE_HEAD" = True + | otherwise = False + +repairStaleLocks :: [FilePath] -> Assistant () +repairStaleLocks lockfiles = go =<< getsizes + where + getsize lf = catchMaybeIO $ + (\s -> (lf, fileSize s)) <$> getFileStatus lf + getsizes = liftIO $ catMaybes <$> mapM getsize lockfiles + go [] = return () + go l = ifM (liftIO $ null <$> Lsof.query ("--" : map fst l)) + ( do + waitforit "to check stale git lock file" + l' <- getsizes + if l' == l + then liftIO $ mapM_ nukeFile (map fst l) + else go l' + , do + waitforit "for git lock file writer" + go =<< getsizes + ) + waitforit why = do + notice ["Waiting for 60 seconds", why] + liftIO $ threadDelaySeconds $ Seconds 60 diff --git a/Assistant/RepoProblem.hs b/Assistant/RepoProblem.hs new file mode 100644 index 0000000000..6913fefc62 --- /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/Restart.hs b/Assistant/Restart.hs new file mode 100644 index 0000000000..0415e8e972 --- /dev/null +++ b/Assistant/Restart.hs @@ -0,0 +1,114 @@ +{- git-annex assistant restarting + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Restart where + +import Assistant.Common +import Assistant.Threads.Watcher +import Assistant.DaemonStatus +import Assistant.NamedThread +import Utility.ThreadScheduler +import Utility.NotificationBroadcaster +import Utility.Url +import Utility.PID +import qualified Git.Construct +import qualified Git.Config +import Config.Files +import qualified Annex +import qualified Git + +import Control.Concurrent +#ifndef mingw32_HOST_OS +import System.Posix (signalProcess, sigTERM) +#else +import Utility.WinProcess +#endif +import Data.Default +import Network.URI + +{- Before the assistant can be restarted, have to remove our + - gitAnnexUrlFile and our gitAnnexPidFile. Pausing the watcher is also + - a good idea, to avoid fighting when two assistants are running in the + - same repo. + -} +prepRestart :: Assistant () +prepRestart = do + liftIO . maybe noop (`throwTo` PauseWatcher) =<< namedThreadId watchThread + liftIO . nukeFile =<< liftAnnex (fromRepo gitAnnexUrlFile) + liftIO . nukeFile =<< liftAnnex (fromRepo gitAnnexPidFile) + +{- To finish a restart, send a global redirect to the new url + - to any web browsers that are displaying the webapp. + - + - Wait for browser to update before terminating this process. -} +postRestart :: URLString -> Assistant () +postRestart url = do + modifyDaemonStatus_ $ \status -> status { globalRedirUrl = Just url } + liftIO . sendNotification . globalRedirNotifier =<< getDaemonStatus + void $ liftIO $ forkIO $ do + threadDelaySeconds (Seconds 120) +#ifndef mingw32_HOST_OS + signalProcess sigTERM =<< getPID +#else + terminatePID =<< getPID +#endif + +runRestart :: Assistant URLString +runRestart = liftIO . newAssistantUrl + =<< liftAnnex (Git.repoLocation <$> Annex.gitRepo) + +{- Starts up the assistant in the repository, and waits for it to create + - a gitAnnexUrlFile. Waits for the assistant to be up and listening for + - connections by testing the url. -} +newAssistantUrl :: FilePath -> IO URLString +newAssistantUrl repo = do + startAssistant repo + geturl + where + geturl = do + r <- Git.Config.read =<< Git.Construct.fromPath repo + waiturl $ gitAnnexUrlFile r + waiturl urlfile = do + v <- tryIO $ readFile urlfile + case v of + Left _ -> delayed $ waiturl urlfile + Right url -> ifM (assistantListening url) + ( return url + , delayed $ waiturl urlfile + ) + delayed a = do + threadDelay 100000 -- 1/10th of a second + a + +{- Checks if the assistant is listening on an url. + - + - Always checks http, because https with self-signed cert is problimatic. + - warp-tls listens to http, in order to show an error page, so this works. + -} +assistantListening :: URLString -> IO Bool +assistantListening url = catchBoolIO $ fst <$> exists url' def + where + url' = case parseURI url of + Nothing -> url + Just uri -> show $ uri + { uriScheme = "http:" + } + +{- Does not wait for assistant to be listening for web connections. + - + - On windows, the assistant does not daemonize, which is why the forkIO is + - done. + -} +startAssistant :: FilePath -> IO () +startAssistant repo = void $ forkIO $ do + program <- readProgramFile + (_, _, _, pid) <- + createProcess $ + (proc program ["assistant"]) { cwd = Just repo } + void $ checkSuccessProcess pid diff --git a/Assistant/ScanRemotes.hs b/Assistant/ScanRemotes.hs new file mode 100644 index 0000000000..2743c0f361 --- /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 0000000000..e1a78cd00e --- /dev/null +++ b/Assistant/Ssh.hs @@ -0,0 +1,353 @@ +{- 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-port_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 $ T.pack $ show $ sshPort 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 0000000000..4bc63241cd --- /dev/null +++ b/Assistant/Sync.hs @@ -0,0 +1,278 @@ +{- 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 Assistant.RemoteControl +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 + +{- Pushes the local sync branch 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] + (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 + sendRemoteControl RELOAD +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 0000000000..afe4aa1442 --- /dev/null +++ b/Assistant/Threads/Committer.hs @@ -0,0 +1,479 @@ +{- 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 qualified Git.Branch + +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 _ -> do + ok <- Command.Sync.commitStaged Git.Branch.AutomaticCommit "" + when ok $ + Command.Sync.updateSyncBranch =<< inRepo Git.Branch.current + return ok + +{- 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 + delta <- liftAnnex getTSDelta + if M.null m + then forM toadd add + else forM toadd $ \c -> do + mcache <- liftIO $ genInodeCache (changeFile c) delta + 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 0000000000..d02e53db55 --- /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 0000000000..55b3ca2f10 --- /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 0000000000..5bbb15acbe --- /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 0000000000..4c4012a676 --- /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 0000000000..62dab59aff --- /dev/null +++ b/Assistant/Threads/Merger.hs @@ -0,0 +1,119 @@ +{- 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 = + whenM (liftAnnex $ inRepo $ Git.Branch.changed current changedbranch) $ do + debug + [ "merging", Git.fromRef changedbranch + , "into", Git.fromRef current + ] + void $ liftAnnex $ autoMergeFrom changedbranch (Just current) Git.Branch.AutomaticCommit + 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 0000000000..bd7aad69c2 --- /dev/null +++ b/Assistant/Threads/MountWatcher.hs @@ -0,0 +1,199 @@ +{- 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 -> +#if MIN_VERSION_dbus(0,10,7) + void $ addMatch client matcher handleevent +#else + listen client matcher handleevent +#endif + , 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 0000000000..f8c456aacf --- /dev/null +++ b/Assistant/Threads/NetWatcher.hs @@ -0,0 +1,184 @@ +{- 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 Assistant.RemoteControl +import Utility.NotificationBroadcaster + +#if WITH_DBUS +import Utility.DBus +import DBus.Client +import DBus +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, or + - signal the RemoteControl, 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 + callback <- asIO1 connchange + liftIO $ do + listenNMConnections client callback + listenWicdConnections client callback + , do + liftAnnex $ + warning "No known network monitor available through dbus; falling back to polling" + ) + connchange False = do + debug ["detected network disconnection"] + sendRemoteControl LOSTNET + connchange True = do + debug ["detected network connection"] + notifyNetMessagerRestart + handleConnection + sendRemoteControl RESUME + 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 NetworkManager connections and diconnections. + - + - Connection example (once fully connected): + - [Variant {"ActivatingConnection": Variant (ObjectPath "/"), "PrimaryConnection": Variant (ObjectPath "/org/freedesktop/NetworkManager/ActiveConnection/34"), "State": Variant 70}] + - + - Disconnection example: + - [Variant {"ActiveConnections": Variant []}] + -} +listenNMConnections :: Client -> (Bool -> IO ()) -> IO () +listenNMConnections client setconnected = +#if MIN_VERSION_dbus(0,10,7) + void $ addMatch client matcher +#else + listen client matcher +#endif + $ \event -> mapM_ handle + (map dictionaryItems $ mapMaybe fromVariant $ signalBody event) + where + matcher = matchAny + { matchInterface = Just "org.freedesktop.NetworkManager" + , matchMember = Just "PropertiesChanged" + } + nm_active_connections_key = toVariant ("ActiveConnections" :: String) + nm_activatingconnection_key = toVariant ("ActivatingConnection" :: String) + noconnections = Just $ toVariant $ toVariant ([] :: [ObjectPath]) + rootconnection = Just $ toVariant $ toVariant $ objectPath_ "/" + handle m + | lookup nm_active_connections_key m == noconnections = + setconnected False + | lookup nm_activatingconnection_key m == rootconnection = + setconnected True + | otherwise = noop + +{- Listens for Wicd connections and disconnections. + - + - Connection example: + - ConnectResultsSent: + - Variant "success" + - + - Diconnection example: + - StatusChanged + - [Variant 0, Variant [Varient ""]] + -} +listenWicdConnections :: Client -> (Bool -> IO ()) -> IO () +listenWicdConnections client setconnected = do + match connmatcher $ \event -> + when (any (== wicd_success) (signalBody event)) $ + setconnected True + match statusmatcher $ \event -> handle (signalBody event) + where + connmatcher = matchAny + { matchInterface = Just "org.wicd.daemon" + , matchMember = Just "ConnectResultsSent" + } + statusmatcher = matchAny + { matchInterface = Just "org.wicd.daemon" + , matchMember = Just "StatusChanged" + } + wicd_success = toVariant ("success" :: String) + wicd_disconnected = toVariant [toVariant ("" :: String)] + handle status + | any (== wicd_disconnected) status = setconnected False + | otherwise = noop + match matcher a = +#if MIN_VERSION_dbus(0,10,7) + void $ addMatch client matcher a +#else + listen client matcher a +#endif +#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 0000000000..cd95ab5a43 --- /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 0000000000..8095581a69 --- /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 0000000000..3ec922fe48 --- /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/RemoteControl.hs b/Assistant/Threads/RemoteControl.hs new file mode 100644 index 0000000000..5af4fddcda --- /dev/null +++ b/Assistant/Threads/RemoteControl.hs @@ -0,0 +1,121 @@ +{- git-annex assistant communication with remotedaemon + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.RemoteControl where + +import Assistant.Common +import RemoteDaemon.Types +import Config.Files +import Utility.Batch +import Utility.SimpleProtocol +import Assistant.Alert +import Assistant.Alert.Utility +import Assistant.DaemonStatus +import qualified Git +import qualified Git.Types as Git +import qualified Remote +import qualified Types.Remote as Remote + +import Control.Concurrent +import Control.Concurrent.Async +import Network.URI +import qualified Data.Map as M +import qualified Data.Set as S + +remoteControlThread :: NamedThread +remoteControlThread = namedThread "RemoteControl" $ do + program <- liftIO readProgramFile + (cmd, params) <- liftIO $ toBatchCommand + (program, [Param "remotedaemon"]) + let p = proc cmd (toCommand params) + (Just toh, Just fromh, _, pid) <- liftIO $ createProcess p + { std_in = CreatePipe + , std_out = CreatePipe + } + + urimap <- liftIO . newMVar =<< liftAnnex getURIMap + + controller <- asIO $ remoteControllerThread toh + responder <- asIO $ remoteResponderThread fromh urimap + + -- run controller and responder until the remotedaemon dies + liftIO $ void $ tryNonAsync $ controller `concurrently` responder + debug ["remotedaemon exited"] + liftIO $ forceSuccessProcess p pid + +-- feed from the remoteControl channel into the remotedaemon +remoteControllerThread :: Handle -> Assistant () +remoteControllerThread toh = do + clicker <- getAssistant remoteControl + forever $ do + msg <- liftIO $ readChan clicker + debug [show msg] + liftIO $ do + hPutStrLn toh $ unwords $ formatMessage msg + hFlush toh + +-- read status messages emitted by the remotedaemon and handle them +remoteResponderThread :: Handle -> MVar (M.Map URI Remote) -> Assistant () +remoteResponderThread fromh urimap = go M.empty + where + go syncalerts = do + l <- liftIO $ hGetLine fromh + debug [l] + case parseMessage l of + Just (CONNECTED uri) -> changeconnected S.insert uri + Just (DISCONNECTED uri) -> changeconnected S.delete uri + Just (SYNCING uri) -> withr uri $ \r -> + if M.member (Remote.uuid r) syncalerts + then go syncalerts + else do + i <- addAlert $ syncAlert [r] + go (M.insert (Remote.uuid r) i syncalerts) + Just (DONESYNCING uri status) -> withr uri $ \r -> + case M.lookup (Remote.uuid r) syncalerts of + Nothing -> cont + Just i -> do + let (succeeded, failed) = if status + then ([r], []) + else ([], [r]) + updateAlertMap $ mergeAlert i $ + syncResultAlert succeeded failed + go (M.delete (Remote.uuid r) syncalerts) + Just (WARNING (RemoteURI uri) msg) -> do + void $ addAlert $ + warningAlert ("RemoteControl "++ show uri) msg + cont + Nothing -> do + debug ["protocol error from remotedaemon: ", l] + cont + where + cont = go syncalerts + withr uri = withRemote uri urimap cont + changeconnected sm uri = withr uri $ \r -> do + changeCurrentlyConnected $ sm $ Remote.uuid r + cont + +getURIMap :: Annex (M.Map URI Remote) +getURIMap = Remote.remoteMap' id (mkk . Git.location . Remote.repo) + where + mkk (Git.Url u) = Just u + mkk _ = Nothing + +withRemote + :: RemoteURI + -> MVar (M.Map URI Remote) + -> Assistant a + -> (Remote -> Assistant a) + -> Assistant a +withRemote (RemoteURI uri) remotemap noremote a = do + m <- liftIO $ readMVar remotemap + case M.lookup uri m of + Just r -> a r + Nothing -> do + {- Reload map, in case a new remote has been added. -} + m' <- liftAnnex getURIMap + void $ liftIO $ swapMVar remotemap $ m' + maybe noremote a (M.lookup uri m') diff --git a/Assistant/Threads/SanityChecker.hs b/Assistant/Threads/SanityChecker.hs new file mode 100644 index 0000000000..b623183823 --- /dev/null +++ b/Assistant/Threads/SanityChecker.hs @@ -0,0 +1,319 @@ +{- 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.Batch +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 +import Annex.Exception +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +#endif +#ifndef mingw32_HOST_OS +import Utility.LogFile +#endif +import Types.Key (keyBackendName) + +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 + + {- Clean up old temp files. -} + void $ liftAnnex $ tryAnnex $ do + cleanOldTmpMisc + cleanReallyOldTmp + + {- 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.Batch.run 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 >>= handleToFd >>= 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 + +{- Files may be left in misctmp by eg, an interrupted add of files + - by the assistant, which hard links files to there as part of lockdown + - checks. Delete these files if they're more than a day old. + - + - Note that this is not safe to run after the Watcher starts up, since it + - will create such files, and due to hard linking they may have old + - mtimes. So, this should only be called from the + - sanityCheckerStartupThread, which runs before the Watcher starts up. + - + - Also, if a git-annex add is being run at the same time the assistant + - starts up, its tmp files could be deleted. However, the watcher will + - come along and add everything once it starts up anyway, so at worst + - this would make the git-annex add fail unexpectedly. + -} +cleanOldTmpMisc :: Annex () +cleanOldTmpMisc = do + now <- liftIO getPOSIXTime + let oldenough = now - (60 * 60 * 24) + tmp <- fromRepo gitAnnexTmpMiscDir + liftIO $ mapM_ (cleanOld (<= oldenough)) =<< dirContentsRecursive tmp + +{- While .git/annex/tmp is now only used for storing partially transferred + - objects, older versions of git-annex used it for misctemp. Clean up any + - files that might be left from that, by looking for files whose names + - cannot be the key of an annexed object. Only delete files older than + - 1 week old. + - + - Also, some remotes such as rsync may use this temp directory for storing + - eg, encrypted objects that are being transferred. So, delete old + - objects that use a GPGHMAC backend. + -} +cleanReallyOldTmp :: Annex () +cleanReallyOldTmp = do + now <- liftIO getPOSIXTime + let oldenough = now - (60 * 60 * 24 * 7) + tmp <- fromRepo gitAnnexTmpObjectDir + liftIO $ mapM_ (cleanjunk (<= oldenough)) =<< dirContentsRecursive tmp + where + cleanjunk check f = case fileKey (takeFileName f) of + Nothing -> cleanOld check f + Just k + | "GPGHMAC" `isPrefixOf` keyBackendName k -> + cleanOld check f + | otherwise -> noop + +cleanOld :: (POSIXTime -> Bool) -> FilePath -> IO () +cleanOld check f = go =<< catchMaybeIO getmtime + where + getmtime = realToFrac . modificationTime <$> getSymbolicLinkStatus f + go (Just mtime) | check mtime = nukeFile f + go _ = noop diff --git a/Assistant/Threads/TransferPoller.hs b/Assistant/Threads/TransferPoller.hs new file mode 100644 index 0000000000..71bfe3676a --- /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 0000000000..daced8d21b --- /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 0000000000..6e87917328 --- /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 0000000000..53d8a578cb --- /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 0000000000..ffad09d3dd --- /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 0000000000..637c82a7d9 --- /dev/null +++ b/Assistant/Threads/Upgrader.hs @@ -0,0 +1,85 @@ +{- 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 qualified Annex +import qualified Build.SysConfig +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 =<< downloadDistributionInfo + 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 + ) diff --git a/Assistant/Threads/Watcher.hs b/Assistant/Threads/Watcher.hs new file mode 100644 index 0000000000..0ed1bd22f9 --- /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 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 0000000000..416c078741 --- /dev/null +++ b/Assistant/Threads/WebApp.hs @@ -0,0 +1,145 @@ +{- 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 +import Network.Wai.Middleware.RequestLogger +import System.Log.Logger + +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 $ logStdout 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 + +{- Checks if debugging is actually enabled. -} +debugEnabled :: IO Bool +debugEnabled = do + l <- getRootLogger + return $ getLevel l <= Just DEBUG diff --git a/Assistant/Threads/XMPPClient.hs b/Assistant/Threads/XMPPClient.hs new file mode 100644 index 0000000000..39b0459b7b --- /dev/null +++ b/Assistant/Threads/XMPPClient.hs @@ -0,0 +1,375 @@ +{- 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 -> UUID -> IO ()) -> Assistant () +restartableClient a = forever $ go =<< liftAnnex getXMPPCreds + where + go Nothing = waitNetMessagerRestart + go (Just creds) = do + xmppuuid <- maybe NoUUID Remote.uuid . headMaybe + . filter Remote.isXMPPRemote . syncRemotes + <$> getDaemonStatus + tid <- liftIO $ forkIO $ a creds xmppuuid + waitNetMessagerRestart + liftIO $ killThread tid + +xmppClient :: UrlRenderer -> AssistantData -> XMPPCreds -> UUID -> IO () +xmppClient urlrenderer d creds xmppuuid = + 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 $ do + modifyDaemonStatus_ $ \s -> s + { xmppClientID = Nothing } + changeCurrentlyConnected $ S.delete xmppuuid + + 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 } + changeCurrentlyConnected $ S.insert xmppuuid + 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 0000000000..30c91c7f09 --- /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 0000000000..93c982224b --- /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 0000000000..cafbb7bdf7 --- /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 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 0000000000..3ac9f34525 --- /dev/null +++ b/Assistant/TransferrerPool.hs @@ -0,0 +1,96 @@ +{- 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 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 -> TransferInfo -> IO Bool +performTransfer transferrer t info = catchBoolIO $ do + T.sendRequest t info (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 0000000000..9fd33c7a21 --- /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 + | ConnectionNeededAlert + | 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 | ConnectionIcon + +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 0000000000..399abee54d --- /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 0000000000..36d8a4fedc --- /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 0000000000..e8ecc6e48b --- /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 0000000000..500faa9011 --- /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/CredPairCache.hs b/Assistant/Types/CredPairCache.hs new file mode 100644 index 0000000000..a1e11c2571 --- /dev/null +++ b/Assistant/Types/CredPairCache.hs @@ -0,0 +1,18 @@ +{- git-annex assistant CredPair cache. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.CredPairCache where + +import Types.Creds + +import Control.Concurrent +import qualified Data.Map as M + +type CredPairCache = MVar (M.Map Login Password) + +newCredPairCache :: IO CredPairCache +newCredPairCache = newMVar M.empty diff --git a/Assistant/Types/DaemonStatus.hs b/Assistant/Types/DaemonStatus.hs new file mode 100644 index 0000000000..2adad2828e --- /dev/null +++ b/Assistant/Types/DaemonStatus.hs @@ -0,0 +1,122 @@ +{- 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 + -- Set of uuids of remotes that are currently connected. + , currentlyConnectedRemotes :: S.Set UUID + -- 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 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 0000000000..5dd1364ad2 --- /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 0000000000..5ae987a616 --- /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.Text.Encoding 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 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 = T.encodeUtf8 $ T.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 0000000000..99e0ee1628 --- /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/RemoteControl.hs b/Assistant/Types/RemoteControl.hs new file mode 100644 index 0000000000..523cd8b8dd --- /dev/null +++ b/Assistant/Types/RemoteControl.hs @@ -0,0 +1,16 @@ +{- git-annex assistant RemoteDaemon control + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.RemoteControl where + +import qualified RemoteDaemon.Types as RemoteDaemon +import Control.Concurrent + +type RemoteControl = Chan RemoteDaemon.Consumed + +newRemoteControl :: IO RemoteControl +newRemoteControl = newChan diff --git a/Assistant/Types/RepoProblem.hs b/Assistant/Types/RepoProblem.hs new file mode 100644 index 0000000000..ece5a52868 --- /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 0000000000..8219f9baf1 --- /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 0000000000..c8d264a381 --- /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 0000000000..1a2aa7eb7f --- /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 0000000000..e4bf2ae922 --- /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 0000000000..5140995a37 --- /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 0000000000..b66fdfa13e --- /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 0000000000..521905bf3c --- /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 0000000000..3ad98c12e2 --- /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/Upgrade.hs b/Assistant/Upgrade.hs new file mode 100644 index 0000000000..1456f8e5ac --- /dev/null +++ b/Assistant/Upgrade.hs @@ -0,0 +1,365 @@ +{- git-annex assistant upgrading + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Upgrade where + +import Assistant.Common +import Assistant.Restart +import qualified Annex +import Assistant.Alert +import Assistant.DaemonStatus +import Utility.Env +import Types.Distribution +import Logs.Transfer +import Logs.Web +import Logs.Presence +import Logs.Location +import Annex.Content +import qualified Backend +import qualified Types.Backend +import qualified Types.Key +import Assistant.TransferQueue +import Assistant.TransferSlots +import Remote (remoteFromUUID) +import Annex.Path +import Config.Files +import Utility.ThreadScheduler +import Utility.Tmp +import Utility.UserInfo +import Utility.Gpg +import Utility.FileMode +import qualified Utility.Lsof as Lsof +import qualified Build.SysConfig +import qualified Utility.Url as Url +import qualified Annex.Url as Url + +import qualified Data.Map as M +import Data.Tuple.Utils + +{- Upgrade without interaction in the webapp. -} +unattendedUpgrade :: Assistant () +unattendedUpgrade = do + prepUpgrade + url <- runRestart + postUpgrade url + +prepUpgrade :: Assistant () +prepUpgrade = do + void $ addAlert upgradingAlert + void $ liftIO $ setEnv upgradedEnv "1" True + prepRestart + +postUpgrade :: URLString -> Assistant () +postUpgrade = postRestart + +autoUpgradeEnabled :: Assistant Bool +autoUpgradeEnabled = liftAnnex $ (==) AutoUpgrade . annexAutoUpgrade <$> Annex.getGitConfig + +checkSuccessfulUpgrade :: IO Bool +checkSuccessfulUpgrade = isJust <$> getEnv upgradedEnv + +upgradedEnv :: String +upgradedEnv = "GIT_ANNEX_UPGRADED" + +{- Start downloading the distribution key from the web. + - Install a hook that will be run once the download is complete, + - and finishes the upgrade. + - + - Creates the destination directory where the upgrade will be installed + - early, in order to check if another upgrade has happened (or is + - happending). On failure, the directory is removed. + -} +startDistributionDownload :: GitAnnexDistribution -> Assistant () +startDistributionDownload d = go =<< liftIO . newVersionLocation d =<< liftIO oldVersionLocation + where + go Nothing = debug ["Skipping redundant upgrade"] + go (Just dest) = do + liftAnnex $ setUrlPresent k u + hook <- asIO1 $ distributionDownloadComplete d dest cleanup + modifyDaemonStatus_ $ \s -> s + { transferHook = M.insert k hook (transferHook s) } + maybe noop (queueTransfer "upgrade" Next (Just f) t) + =<< liftAnnex (remoteFromUUID webUUID) + startTransfer t + k = distributionKey d + u = distributionUrl d + f = takeFileName u ++ " (for upgrade)" + t = Transfer + { transferDirection = Download + , transferUUID = webUUID + , transferKey = k + } + cleanup = liftAnnex $ do + removeAnnex k + setUrlMissing k u + logStatus k InfoMissing + +{- Called once the download is done. + - Passed an action that can be used to clean up the downloaded file. + - + - Fsck the key to verify the download. + -} +distributionDownloadComplete :: GitAnnexDistribution -> FilePath -> Assistant () -> Transfer -> Assistant () +distributionDownloadComplete d dest cleanup t + | transferDirection t == Download = do + debug ["finished downloading git-annex distribution"] + maybe (failedupgrade "bad download") go + =<< liftAnnex (withObjectLoc k fsckit (getM fsckit)) + | otherwise = cleanup + where + k = distributionKey d + fsckit f = case Backend.maybeLookupBackendName (Types.Key.keyBackendName k) of + Nothing -> return $ Just f + Just b -> case Types.Backend.fsckKey b of + Nothing -> return $ Just f + Just a -> ifM (a k f) + ( return $ Just f + , return Nothing + ) + go f = do + ua <- asIO $ upgradeToDistribution dest cleanup f + fa <- asIO1 failedupgrade + liftIO $ ua `catchNonAsync` (fa . show) + failedupgrade msg = do + void $ addAlert $ upgradeFailedAlert msg + cleanup + liftIO $ void $ tryIO $ removeDirectoryRecursive dest + +{- The upgrade method varies by OS. + - + - In general, find where the distribution was installed before, + - and unpack the new distribution next to it (in a versioned directory). + - Then update the programFile to point to the new version. + -} +upgradeToDistribution :: FilePath -> Assistant () -> FilePath -> Assistant () +upgradeToDistribution newdir cleanup distributionfile = do + liftIO $ createDirectoryIfMissing True newdir + (program, deleteold) <- unpack + changeprogram program + cleanup + prepUpgrade + url <- runRestart + {- At this point, the new assistant is fully running, so + - it's safe to delete the old version. -} + liftIO $ void $ tryIO deleteold + postUpgrade url + where + changeprogram program = liftIO $ do + unlessM (boolSystem program [Param "version"]) $ + error "New git-annex program failed to run! Not using." + pf <- programFile + liftIO $ writeFile pf program + +#ifdef darwin_HOST_OS + {- OS X uses a dmg, so mount it, and copy the contents into place. -} + unpack = liftIO $ do + olddir <- oldVersionLocation + withTmpDirIn (parentDir newdir) "git-annex.upgrade" $ \tmpdir -> do + void $ boolSystem "hdiutil" + [ Param "attach", File distributionfile + , Param "-mountpoint", File tmpdir + ] + void $ boolSystem "cp" + [ Param "-R" + , File $ tmpdir installBase "Contents" + , File $ newdir + ] + void $ boolSystem "hdiutil" + [ Param "eject" + , File tmpdir + ] + sanitycheck newdir + let deleteold = do + deleteFromManifest $ olddir "Contents" "MacOS" + makeorigsymlink olddir + return (newdir "Contents" "MacOS" "git-annex", deleteold) +#else + {- Linux uses a tarball (so could other POSIX systems), so + - untar it (into a temp directory) and move the directory + - into place. -} + unpack = liftIO $ do + olddir <- oldVersionLocation + withTmpDirIn (parentDir newdir) "git-annex.upgrade" $ \tmpdir -> do + let tarball = tmpdir "tar" + -- Cannot rely on filename extension, and this also + -- avoids problems if tar doesn't support transparent + -- decompression. + void $ boolSystem "sh" + [ Param "-c" + , Param $ "zcat < " ++ shellEscape distributionfile ++ + " > " ++ shellEscape tarball + ] + tarok <- boolSystem "tar" + [ Param "xf" + , Param tarball + , Param "--directory", File tmpdir + ] + unless tarok $ + error $ "failed to untar " ++ distributionfile + sanitycheck $ tmpdir installBase + installby rename newdir (tmpdir installBase) + let deleteold = do + deleteFromManifest olddir + makeorigsymlink olddir + return (newdir "git-annex", deleteold) + installby a dstdir srcdir = + mapM_ (\x -> a x (dstdir takeFileName x)) + =<< dirContents srcdir +#endif + sanitycheck dir = + unlessM (doesDirectoryExist dir) $ + error $ "did not find " ++ dir ++ " in " ++ distributionfile + makeorigsymlink olddir = do + let origdir = parentDir olddir installBase + nukeFile origdir + createSymbolicLink newdir origdir + +{- Finds where the old version was installed. -} +oldVersionLocation :: IO FilePath +oldVersionLocation = do + pdir <- parentDir <$> readProgramFile +#ifdef darwin_HOST_OS + let dirs = splitDirectories pdir + {- It will probably be deep inside a git-annex.app directory. -} + let olddir = case findIndex ("git-annex.app" `isPrefixOf`) dirs of + Nothing -> pdir + Just i -> joinPath (take (i + 1) dirs) +#else + let olddir = pdir +#endif + when (null olddir) $ + error $ "Cannot find old distribution bundle; not upgrading. (Looked in " ++ pdir ++ ")" + return olddir + +{- Finds a place to install the new version. + - Generally, put it in the parent directory of where the old version was + - installed, and use a version number in the directory name. + - If unable to write to there, instead put it in the home directory. + - + - The directory is created. If it already exists, returns Nothing. + -} +newVersionLocation :: GitAnnexDistribution -> FilePath -> IO (Maybe FilePath) +newVersionLocation d olddir = + trymkdir newloc $ do + home <- myHomeDir + trymkdir (home s) $ + return Nothing + where + s = installBase ++ "." ++ distributionVersion d + topdir = parentDir olddir + newloc = topdir s + trymkdir dir fallback = + (createDirectory dir >> return (Just dir)) + `catchIO` const fallback + +installBase :: String +installBase = "git-annex." ++ +#ifdef linux_HOST_OS + "linux" +#else +#ifdef darwin_HOST_OS + "app" +#else + "dir" +#endif +#endif + +deleteFromManifest :: FilePath -> IO () +deleteFromManifest dir = do + fs <- map (dir ) . lines <$> catchDefaultIO "" (readFile manifest) + mapM_ nukeFile fs + nukeFile manifest + removeEmptyRecursive dir + where + manifest = dir "git-annex.MANIFEST" + +removeEmptyRecursive :: FilePath -> IO () +removeEmptyRecursive dir = do + mapM_ removeEmptyRecursive =<< dirContents dir + void $ tryIO $ removeDirectory dir + +{- This is a file that the UpgradeWatcher can watch for modifications to + - detect when git-annex has been upgraded. + -} +upgradeFlagFile :: IO (Maybe FilePath) +upgradeFlagFile = ifM usingDistribution + ( Just <$> programFile + , programPath + ) + +{- Sanity check to see if an upgrade is complete and the program is ready + - to be run. -} +upgradeSanityCheck :: IO Bool +upgradeSanityCheck = ifM usingDistribution + ( doesFileExist =<< programFile + , do + -- Ensure that the program is present, and has no writers, + -- and can be run. This should handle distribution + -- upgrades, manual upgrades, etc. + v <- programPath + case v of + Nothing -> return False + Just program -> do + untilM (doesFileExist program <&&> nowriter program) $ + threadDelaySeconds (Seconds 60) + boolSystem program [Param "version"] + ) + where + nowriter f = null + . filter (`elem` [Lsof.OpenReadWrite, Lsof.OpenWriteOnly]) + . map snd3 + <$> Lsof.query [f] + +usingDistribution :: IO Bool +usingDistribution = isJust <$> getEnv "GIT_ANNEX_STANDLONE_ENV" + +downloadDistributionInfo :: Assistant (Maybe GitAnnexDistribution) +downloadDistributionInfo = do + uo <- liftAnnex Url.getUrlOptions + liftIO $ withTmpDir "git-annex.tmp" $ \tmpdir -> do + let infof = tmpdir "info" + let sigf = infof ++ ".sig" + ifM (Url.downloadQuiet distributionInfoUrl infof uo + <&&> Url.downloadQuiet distributionInfoSigUrl sigf uo + <&&> verifyDistributionSig sigf) + ( readish <$> readFileStrict infof + , return Nothing + ) + +distributionInfoUrl :: String +distributionInfoUrl = fromJust Build.SysConfig.upgradelocation ++ ".info" + +distributionInfoSigUrl :: String +distributionInfoSigUrl = distributionInfoUrl ++ ".sig" + +{- Verifies that a file from the git-annex distribution has a valid + - signature. Pass the detached .sig file; the file to be verified should + - be located next to it. + - + - The gpg keyring used to verify the signature is located in + - trustedkeys.gpg, next to the git-annex program. + -} +verifyDistributionSig :: FilePath -> IO Bool +verifyDistributionSig sig = do + p <- readProgramFile + if isAbsolute p + then withUmask 0o0077 $ withTmpDir "git-annex-gpg.tmp" $ \gpgtmp -> do + let trustedkeys = takeDirectory p "trustedkeys.gpg" + boolSystem gpgcmd + [ Param "--no-default-keyring" + , Param "--no-auto-check-trustdb" + , Param "--no-options" + , Param "--homedir" + , File gpgtmp + , Param "--keyring" + , File trustedkeys + , Param "--verify" + , File sig + ] + else return False diff --git a/Assistant/WebApp.hs b/Assistant/WebApp.hs new file mode 100644 index 0000000000..e81a1d7120 --- /dev/null +++ b/Assistant/WebApp.hs @@ -0,0 +1,74 @@ +{- git-annex assistant webapp core + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE TypeFamilies, QuasiQuotes, MultiParamTypeClasses #-} +{-# LANGUAGE TemplateHaskell, OverloadedStrings, RankNTypes #-} + +module Assistant.WebApp where + +import Assistant.WebApp.Types +import Assistant.Common +import Utility.NotificationBroadcaster +import Utility.Yesod +import Utility.WebApp + +import Data.Text (Text) +import Control.Concurrent +import qualified Network.Wai as W +import qualified Data.ByteString.Char8 as S8 +import qualified Data.Text as T + +waitNotifier :: Assistant NotificationBroadcaster -> NotificationId -> Handler () +waitNotifier getbroadcaster nid = liftAssistant $ do + b <- getbroadcaster + liftIO $ waitNotification $ notificationHandleFromId b nid + +newNotifier :: Assistant NotificationBroadcaster -> Handler NotificationId +newNotifier getbroadcaster = liftAssistant $ do + b <- getbroadcaster + liftIO $ notificationHandleToId <$> newNotificationHandle True b + +{- Adds the auth parameter as a hidden field on a form. Must be put into + - every form. -} +webAppFormAuthToken :: Widget +webAppFormAuthToken = do + webapp <- liftH getYesod + [whamlet||] + +{- A button with an icon, and maybe label or tooltip, that can be + - clicked to perform some action. + - With javascript, clicking it POSTs the Route, and remains on the same + - page. + - With noscript, clicking it GETs the Route. -} +actionButton :: Route WebApp -> (Maybe String) -> (Maybe String) -> String -> String -> Widget +actionButton route label tooltip buttonclass iconclass = $(widgetFile "actionbutton") + +type UrlRenderFunc = Route WebApp -> [(Text, Text)] -> Text +type UrlRenderer = MVar (UrlRenderFunc) + +newUrlRenderer :: IO UrlRenderer +newUrlRenderer = newEmptyMVar + +setUrlRenderer :: UrlRenderer -> (UrlRenderFunc) -> IO () +setUrlRenderer = putMVar + +inFirstRun :: Handler Bool +inFirstRun = isNothing . relDir <$> getYesod + +{- Blocks until the webapp is running and has called setUrlRenderer. -} +renderUrl :: UrlRenderer -> Route WebApp -> [(Text, Text)] -> IO Text +renderUrl urlrenderer route params = do + r <- readMVar urlrenderer + return $ r route params + +{- Redirects back to the referring page, or if there's none, DashboardR -} +redirectBack :: Handler () +redirectBack = do + mr <- lookup "referer" . W.requestHeaders <$> waiRequest + case mr of + Nothing -> redirect DashboardR + Just r -> redirect $ T.pack $ S8.unpack r diff --git a/Assistant/WebApp/Bootstrap3.hs b/Assistant/WebApp/Bootstrap3.hs new file mode 100644 index 0000000000..795778a8d4 --- /dev/null +++ b/Assistant/WebApp/Bootstrap3.hs @@ -0,0 +1,284 @@ +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE CPP #-} +-- | Helper functions for creating forms when using Bootstrap v3. +-- This is a copy of the Yesod.Form.Bootstrap3 module that has been slightly +-- modified to be compatible with Yesod 1.0.1 +module Assistant.WebApp.Bootstrap3 + ( -- * Rendering forms + renderBootstrap3 + , BootstrapFormLayout(..) + , BootstrapGridOptions(..) + -- * Field settings + , bfs + , withPlaceholder + , withAutofocus + , withLargeInput + , withSmallInput + -- * Submit button + , bootstrapSubmit + , mbootstrapSubmit + , BootstrapSubmit(..) + ) where + +import Control.Arrow (second) +import Control.Monad (liftM) +import Data.Text (Text) +import Data.String (IsString(..)) +import Yesod.Core + +import qualified Data.Text as T + +import Yesod.Form.Types +import Yesod.Form.Functions + +-- | Create a new 'FieldSettings' with the classes that are +-- required by Bootstrap v3. +-- +-- Since: yesod-form 1.3.8 +bfs :: RenderMessage site msg => msg -> FieldSettings site +bfs msg = + FieldSettings (SomeMessage msg) Nothing Nothing Nothing [("class", "form-control")] + + +-- | Add a placeholder attribute to a field. If you need i18n +-- for the placeholder, currently you\'ll need to do a hack and +-- use 'getMessageRender' manually. +-- +-- Since: yesod-form 1.3.8 +withPlaceholder :: Text -> FieldSettings site -> FieldSettings site +withPlaceholder placeholder fs = fs { fsAttrs = newAttrs } + where newAttrs = ("placeholder", placeholder) : fsAttrs fs + + +-- | Add an autofocus attribute to a field. +-- +-- Since: yesod-form 1.3.8 +withAutofocus :: FieldSettings site -> FieldSettings site +withAutofocus fs = fs { fsAttrs = newAttrs } + where newAttrs = ("autofocus", "autofocus") : fsAttrs fs + + +-- | Add the @input-lg@ CSS class to a field. +-- +-- Since: yesod-form 1.3.8 +withLargeInput :: FieldSettings site -> FieldSettings site +withLargeInput fs = fs { fsAttrs = newAttrs } + where newAttrs = addClass "input-lg" (fsAttrs fs) + + +-- | Add the @input-sm@ CSS class to a field. +-- +-- Since: yesod-form 1.3.8 +withSmallInput :: FieldSettings site -> FieldSettings site +withSmallInput fs = fs { fsAttrs = newAttrs } + where newAttrs = addClass "input-sm" (fsAttrs fs) + + +addClass :: Text -> [(Text, Text)] -> [(Text, Text)] +addClass klass [] = [("class", klass)] +addClass klass (("class", old):rest) = ("class", T.concat [old, " ", klass]) : rest +addClass klass (other :rest) = other : addClass klass rest + + +-- | How many bootstrap grid columns should be taken (see +-- 'BootstrapFormLayout'). +-- +-- Since: yesod-form 1.3.8 +data BootstrapGridOptions = + ColXs !Int + | ColSm !Int + | ColMd !Int + | ColLg !Int + deriving (Eq, Ord, Show) + +toColumn :: BootstrapGridOptions -> String +toColumn (ColXs 0) = "" +toColumn (ColSm 0) = "" +toColumn (ColMd 0) = "" +toColumn (ColLg 0) = "" +toColumn (ColXs columns) = "col-xs-" ++ show columns +toColumn (ColSm columns) = "col-sm-" ++ show columns +toColumn (ColMd columns) = "col-md-" ++ show columns +toColumn (ColLg columns) = "col-lg-" ++ show columns + +toOffset :: BootstrapGridOptions -> String +toOffset (ColXs 0) = "" +toOffset (ColSm 0) = "" +toOffset (ColMd 0) = "" +toOffset (ColLg 0) = "" +toOffset (ColXs columns) = "col-xs-offset-" ++ show columns +toOffset (ColSm columns) = "col-sm-offset-" ++ show columns +toOffset (ColMd columns) = "col-md-offset-" ++ show columns +toOffset (ColLg columns) = "col-lg-offset-" ++ show columns + +addGO :: BootstrapGridOptions -> BootstrapGridOptions -> BootstrapGridOptions +addGO (ColXs a) (ColXs b) = ColXs (a+b) +addGO (ColSm a) (ColSm b) = ColSm (a+b) +addGO (ColMd a) (ColMd b) = ColMd (a+b) +addGO (ColLg a) (ColLg b) = ColLg (a+b) +addGO a b | a > b = addGO b a +addGO (ColXs a) other = addGO (ColSm a) other +addGO (ColSm a) other = addGO (ColMd a) other +addGO (ColMd a) other = addGO (ColLg a) other +addGO (ColLg _) _ = error "Yesod.Form.Bootstrap.addGO: never here" + + +-- | The layout used for the bootstrap form. +-- +-- Since: yesod-form 1.3.8 +data BootstrapFormLayout = + BootstrapBasicForm + | BootstrapInlineForm + | BootstrapHorizontalForm + { bflLabelOffset :: !BootstrapGridOptions + , bflLabelSize :: !BootstrapGridOptions + , bflInputOffset :: !BootstrapGridOptions + , bflInputSize :: !BootstrapGridOptions + } + deriving (Show) + + +-- | Render the given form using Bootstrap v3 conventions. +-- +-- Sample Hamlet for 'BootstrapHorizontalForm': +-- +-- >
+-- > ^{formWidget} +-- > ^{bootstrapSubmit MsgSubmit} +-- +-- Since: yesod-form 1.3.8 +#if MIN_VERSION_yesod(1,2,0) +renderBootstrap3 :: Monad m => BootstrapFormLayout -> FormRender m a +#else +renderBootstrap3 :: BootstrapFormLayout -> FormRender sub master a +#endif +renderBootstrap3 formLayout aform fragment = do + (res, views') <- aFormToForm aform + let views = views' [] + has (Just _) = True + has Nothing = False + widget = [whamlet| +#if MIN_VERSION_yesod(1,2,0) + $newline never +#endif + #{fragment} + $forall view <- views +
+ $case formLayout + $of BootstrapBasicForm + $if nequals (fvId view) bootstrapSubmitId +